【InternLM 實戰營筆記】XTuner 大模型單卡低成本微調實戰

XTuner概述

一個大語言模型微調工具箱。由 MMRazor 和 MMDeploy 聯合開發。

支持的開源LLM (2023.11.01)

InternLM
Llama,Llama2
ChatGLM2,ChatGLM3
Qwen
Baichuan,Baichuan2
Zephyr

特色

傻瓜化: 以 配置文件 的形式封裝了大部分微調場景,0基礎的非專業人員也能一鍵開始微調。
輕量級: 對于 7B 參數量的LLM,微調所需的最小顯存僅為 8GB : 消費級顯卡,colab

微調原理

  • 因此,你找到了一種叫 LoRA 的方法:只對玩具中的某些零件進行改動,而不是對整個玩具進行全面改動。
  • 而 QLoRA 是 LoRA 的一種改進:如果你手里只有一把生銹的螺絲刀,也能改造你的玩具。

實踐過程

安裝

# 如果你是在 InternStudio 平臺,則從本地 clone 一個已有 pytorch 2.0.1 的環境:
/root/share/install_conda_env_internlm_base.sh xtuner0.1.9# 激活環境
conda activate xtuner0.1.9
# 進入家目錄 (~的意思是 “當前用戶的home路徑”)
cd ~
# 創建版本文件夾并進入,以跟隨本教程
mkdir xtuner019 && cd xtuner019# 拉取 0.1.9 的版本源碼
git clone -b v0.1.9  https://github.com/InternLM/xtuner
# 無法訪問github的用戶請從 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner# 進入源碼目錄
cd xtuner# 從源碼安裝 XTuner
pip install -e '.[all]'

準備在 oasst1 數據集上微調 internlm-7b-chat

# 創建一個微調 oasst1 數據集的工作路徑,進入
mkdir ~/ft-oasst1 && cd ~/ft-oasst1

微調

XTuner 提供多個開箱即用的配置文件,用戶可以通過下列命令查看:

# 列出所有內置配置
xtuner list-cfg

拷貝一個配置文件到當前目錄:

# xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH}

本例中

cd ~/ft-oasst1
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

模型下載

直接復制模型

ln -s /share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/

數據集下載

cd ~/ft-oasst1
# ...-guanaco 后面有個空格和英文句號啊
cp -r /root/share/temp/datasets/openassistant-guanaco .

修改配置文件

cd ~/ft-oasst1
vim internlm_chat_7b_qlora_oasst1_e3_copy.py

開始微調

xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

將得到的 PTH 模型轉換為 HuggingFace 模型,即:生成 Adapter 文件夾

mkdir hf
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf

部署與測試

將 HuggingFace adapter 合并到大語言模型

xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB

與合并后的模型對話

xtuner chat ./merged --prompt-template internlm_chat

修改 cli_demo.py 中的模型路徑

- model_name_or_path = "/root/model/Shanghai_AI_Laboratory/internlm-chat-7b"
+ model_name_or_path = "merged"

運行

python ./cli_demo.py

自定義微調

基于 InternLM-chat-7B 模型,用 MedQA 數據集進行微調,將其往醫學問答領域對齊。

數據集

https://github.com/abachaa/Medication_QA_MedInfo2019

準備工作

將數據轉為 XTuner 的數據格式(jsonL
目標格式:(.jsonL)

[{"conversation":[{"system": "xxx","input": "xxx","output": "xxx"}]
},
{"conversation":[{"system": "xxx","input": "xxx","output": "xxx"}]
}]

通過 python 腳本:將 .xlsx 中的 問題 和 回答 兩列 提取出來,再放入 .jsonL 文件的每個 conversation 的 input 和 output 中。
這一步的 python 腳本可以請 ChatGPT 來完成。

Write a python file for me. using openpyxl. input file name is MedQA2019.xlsx
Step1: The input file is .xlsx. Exact the column A and column D in the sheet named "DrugQA" .
Step2: Put each value in column A into each "input" of each "conversation". Put each value in column D into each "output" of each "conversation".
Step3: The output file is .jsonL. It looks like:
[{"conversation":[{"system": "xxx","input": "xxx","output": "xxx"}]
},
{"conversation":[{"system": "xxx","input": "xxx","output": "xxx"}]
}]
Step4: All "system" value changes to "You are a professional, highly experienced doctor professor. You always provide accurate, comprehensive, and detailed answers based on the patients' questions."

生成的代碼如下:

import openpyxl
import jsondef process_excel_to_json(input_file, output_file):# Load the workbookwb = openpyxl.load_workbook(input_file)# Select the "DrugQA" sheetsheet = wb["DrugQA"]# Initialize the output data structureoutput_data = []# Iterate through each row in column A and Dfor row in sheet.iter_rows(min_row=2, max_col=4, values_only=True):system_value = "You are a professional, highly experienced doctor professor. You always provide accurate, comprehensive, and detailed answers based on the patients' questions."# Create the conversation dictionaryconversation = {"system": system_value,"input": row[0],"output": row[3]}# Append the conversation to the output dataoutput_data.append({"conversation": [conversation]})# Write the output data to a JSON filewith open(output_file, 'w', encoding='utf-8') as json_file:json.dump(output_data, json_file, indent=4)print(f"Conversion complete. Output written to {output_file}")# Replace 'MedQA2019.xlsx' and 'output.jsonl' with your actual input and output file names
process_excel_to_json('MedQA2019.xlsx', 'output.jsonl')

執行腳本:

python xlsx2jsonl.py

劃分訓練集和測試集

my .jsonL file looks like:
[{"conversation":[{"system": "xxx","input": "xxx","output": "xxx"}]
},
{"conversation":[{"system": "xxx","input": "xxx","output": "xxx"}]
}]
Step1, read the .jsonL file.
Step2, count the amount of the "conversation" elements.
Step3, randomly split all "conversation" elements by 7:3. Targeted structure is same as the input.
Step4, save the 7/10 part as train.jsonl. save the 3/10 part as test.jsonl

代碼如下:

import json
import randomdef split_conversations(input_file, train_output_file, test_output_file):# Read the input JSONL filewith open(input_file, 'r', encoding='utf-8') as jsonl_file:data = json.load(jsonl_file)# Count the number of conversation elementsnum_conversations = len(data)# Shuffle the data randomlyrandom.shuffle(data)random.shuffle(data)random.shuffle(data)# Calculate the split points for train and testsplit_point = int(num_conversations * 0.7)# Split the data into train and testtrain_data = data[:split_point]test_data = data[split_point:]# Write the train data to a new JSONL filewith open(train_output_file, 'w', encoding='utf-8') as train_jsonl_file:json.dump(train_data, train_jsonl_file, indent=4)# Write the test data to a new JSONL filewith open(test_output_file, 'w', encoding='utf-8') as test_jsonl_file:json.dump(test_data, test_jsonl_file, indent=4)print(f"Split complete. Train data written to {train_output_file}, Test data written to {test_output_file}")# Replace 'input.jsonl', 'train.jsonl', and 'test.jsonl' with your actual file names
split_conversations('MedQA2019-structured.jsonl', 'MedQA2019-structured-train.jsonl', 'MedQA2019-structured-test.jsonl')

開始自定義微調

此時,我們重新建一個文件夾來玩“微調自定義數據集”

mkdir ~/ft-medqa && cd ~/ft-medqa

把前面下載好的internlm-chat-7b模型文件夾拷貝過來。

cp -r ~/ft-oasst1/internlm-chat-7b .

別忘了把自定義數據集,即幾個 .jsonL,也傳到服務器上。

git clone https://github.com/InternLM/tutorial
cp ~/tutorial/xtuner/MedQA2019-structured-train.jsonl .

準備配置文件

# 復制配置文件到當前目錄
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
# 改個文件名
mv internlm_chat_7b_qlora_oasst1_e3_copy.py internlm_chat_7b_qlora_medqa2019_e3.py# 修改配置文件內容
vim internlm_chat_7b_qlora_medqa2019_e3.py

減號代表要刪除的行,加號代表要增加的行。

# 修改import部分
- from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
+ from xtuner.dataset.map_fns import template_map_fn_factory# 修改模型為本地路徑
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'# 修改訓練數據為 MedQA2019-structured-train.jsonl 路徑
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = 'MedQA2019-structured-train.jsonl'# 修改 train_dataset 對象
train_dataset = dict(type=process_hf_dataset,
-   dataset=dict(type=load_dataset, path=data_path),
+   dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)),tokenizer=tokenizer,max_length=max_length,
-   dataset_map_fn=alpaca_map_fn,
+   dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length)

啟動

xtuner train internlm_chat_7b_qlora_medqa2019_e3.py --deepspeed deepspeed_zero2

用 MS-Agent 數據集 賦予 LLM 以 Agent 能力

MSAgent 數據集每條樣本包含一個對話列表(conversations),其里面包含了 system、user、assistant 三種字段。其中:

  • system: 表示給模型前置的人設輸入,其中有告訴模型如何調用插件以及生成請求

  • user: 表示用戶的輸入 prompt,分為兩種,通用生成的prompt和調用插件需求的 prompt

  • assistant: 為模型的回復。其中會包括插件調用代碼和執行代碼,調用代碼是要 LLM 生成的,而執行代碼是調用服務來生成結果的

微調

xtuner 是從國內的 ModelScope 平臺下載 MS-Agent 數據集,因此不用提前手動下載數據集文件。

# 準備工作
mkdir ~/ft-msagent && cd ~/ft-msagent
cp -r ~/ft-oasst1/internlm-chat-7b .# 查看配置文件
xtuner list-cfg | grep msagent# 復制配置文件到當前目錄
xtuner copy-cfg internlm_7b_qlora_msagent_react_e3_gpu8 .# 修改配置文件中的模型為本地路徑
vim ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py 
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'

開始微調

xtuner train ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py --deepspeed deepspeed_zero2

使用

由于 msagent 的訓練非常費時,大家如果想盡快把這個教程跟完,可以直接從 modelScope 拉取咱們已經微調好了的 Adapter。如下演示。

下載 Adapter

cd ~/ft-msagent
apt install git git-lfs
git lfs install
git lfs clone https://www.modelscope.cn/xtuner/internlm-7b-qlora-msagent-react.git

OK,現在目錄應該長這樣:

internlm_7b_qlora_msagent_react_e3_gpu8_copy.py
internlm-7b-qlora-msagent-react
internlm-chat-7b
work_dir(可有可無)`

有了這個在 msagent 上訓練得到的Adapter,模型現在已經有 agent 能力了!就可以加 --lagent 以調用來自 lagent 的代理功能了!

添加 serper 環境變量

開始 chat 之前,還要加個 serper 的環境變量:

去 serper.dev 免費注冊一個賬號,生成自己的 api key。這個東西是用來給 lagent 去獲取 google 搜索的結果的。等于是 serper.dev 幫你去訪問 google,而不是從你自己本地去訪問 google 了。

添加 serper api key 到環境變量:

export SERPER_API_KEY=你的API_KEY

啟動

xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent

報錯處理
xtuner chat 增加 --lagent 參數后,報錯

TypeError: transfomers.modelsauto.auto factory. BaseAutoModelClass.from pretrained() got multiple values for keyword argument "trust remote code"

注釋掉已安裝包中的代碼:

vim /root/xtuner019/xtuner/xtuner/tools/chat.py

作業

conda create --name personal_assistant --clone=/root/share/conda_envs/internlm-base
# 如果在其他平臺:
# conda create --name personal_assistant python=3.10 -y# 激活環境
conda activate personal_assistant
# 進入家目錄 (~的意思是 “當前用戶的home路徑”)
cd ~
# 創建版本文件夾并進入,以跟隨本教程
# personal_assistant用于存放本教程所使用的東西
mkdir /root/personal_assistant && cd /root/personal_assistant
mkdir /root/personal_assistant/xtuner019 && cd /root/personal_assistant/xtuner019# 拉取 0.1.9 的版本源碼
git clone -b v0.1.9  https://github.com/InternLM/xtuner
# 無法訪問github的用戶請從 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner# 進入源碼目錄
cd xtuner# 從源碼安裝 XTuner
pip install -e '.[all]'

數據準備

mkdir -p /root/personal_assistant/data && cd /root/personal_assistant/data

在data目錄下創建一個json文件personal_assistant.json作為本次微調所使用的數據集。json中內容可參考下方(復制粘貼n次做數據增廣,數據量小無法有效微調,下面僅用于展示格式,下面也有生成腳本)

其中conversation表示一次對話的內容,input為輸入,即用戶會問的問題,output為輸出,即想要模型回答的答案。

以下是一個python腳本,用于生成數據集。在data目錄下新建一個generate_data.py文件,將以下代碼復制進去,然后運行該腳本即可生成數據集。

import json# 輸入你的名字
name = 'Shengshenlan'
# 重復次數
n = 10000data = [{"conversation": [{"input": "請做一下自我介紹","output": "我是{}的小助手,內在是上海AI實驗室書生·浦語的7B大模型哦".format(name)}]}
]for i in range(n):data.append(data[0])with open('personal_assistant.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)

配置準備

mkdir -p /root/personal_assistant/model/Shanghai_AI_Laboratory
cp -r /root/share/temp/model_repos/internlm-chat-7b /root/personal_assistant/model/Shanghai_AI_Laboratory#創建用于存放配置的文件夾config并進入
mkdir /root/personal_assistant/config && cd /root/personal_assistant/configxtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

修改拷貝后的文件internlm_chat_7b_qlora_oasst1_e3_copy.py

# Copyright (c) OpenMMLab. All rights reserved.
import torch
from bitsandbytes.optim import PagedAdamW32bit
from datasets import load_dataset
from mmengine.dataset import DefaultSampler
from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook,LoggerHook, ParamSchedulerHook)
from mmengine.optim import AmpOptimWrapper, CosineAnnealingLR
from peft import LoraConfig
from transformers import (AutoModelForCausalLM, AutoTokenizer,BitsAndBytesConfig)from xtuner.dataset import process_hf_dataset
from xtuner.dataset.collate_fns import default_collate_fn
from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
from xtuner.engine import DatasetInfoHook, EvaluateChatHook
from xtuner.model import SupervisedFinetune
from xtuner.utils import PROMPT_TEMPLATE#######################################################################
#                          PART 1  Settings                           #
#######################################################################
# Model
pretrained_model_name_or_path = '/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b'# Data
data_path = '/root/personal_assistant/data/personal_assistant.json'
prompt_template = PROMPT_TEMPLATE.internlm_chat
max_length = 512
pack_to_max_length = True# Scheduler & Optimizer
batch_size = 2  # per_device
accumulative_counts = 16
dataloader_num_workers = 0
max_epochs = 3
optim_type = PagedAdamW32bit
lr = 2e-4
betas = (0.9, 0.999)
weight_decay = 0
max_norm = 1  # grad clip# Evaluate the generation performance during the training
evaluation_freq = 90
SYSTEM = ''
evaluation_inputs = [ '請介紹一下你自己', '請做一下自我介紹' ]#######################################################################
#                      PART 2  Model & Tokenizer                      #
#######################################################################
tokenizer = dict(type=AutoTokenizer.from_pretrained,pretrained_model_name_or_path=pretrained_model_name_or_path,trust_remote_code=True,padding_side='right')model = dict(type=SupervisedFinetune,llm=dict(type=AutoModelForCausalLM.from_pretrained,pretrained_model_name_or_path=pretrained_model_name_or_path,trust_remote_code=True,torch_dtype=torch.float16,quantization_config=dict(type=BitsAndBytesConfig,load_in_4bit=True,load_in_8bit=False,llm_int8_threshold=6.0,llm_int8_has_fp16_weight=False,bnb_4bit_compute_dtype=torch.float16,bnb_4bit_use_double_quant=True,bnb_4bit_quant_type='nf4')),lora=dict(type=LoraConfig,r=64,lora_alpha=16,lora_dropout=0.1,bias='none',task_type='CAUSAL_LM'))#######################################################################
#                      PART 3  Dataset & Dataloader                   #
#######################################################################
train_dataset = dict(type=process_hf_dataset,dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)),tokenizer=tokenizer,max_length=max_length,dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length)train_dataloader = dict(batch_size=batch_size,num_workers=dataloader_num_workers,dataset=train_dataset,sampler=dict(type=DefaultSampler, shuffle=True),collate_fn=dict(type=default_collate_fn))#######################################################################
#                    PART 4  Scheduler & Optimizer                    #
#######################################################################
# optimizer
optim_wrapper = dict(type=AmpOptimWrapper,optimizer=dict(type=optim_type, lr=lr, betas=betas, weight_decay=weight_decay),clip_grad=dict(max_norm=max_norm, error_if_nonfinite=False),accumulative_counts=accumulative_counts,loss_scale='dynamic',dtype='float16')# learning policy
# More information: https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md  # noqa: E501
param_scheduler = dict(type=CosineAnnealingLR,eta_min=0.0,by_epoch=True,T_max=max_epochs,convert_to_iter_based=True)# train, val, test setting
train_cfg = dict(by_epoch=True, max_epochs=max_epochs, val_interval=1)#######################################################################
#                           PART 5  Runtime                           #
#######################################################################
# Log the dialogue periodically during the training process, optional
custom_hooks = [dict(type=DatasetInfoHook, tokenizer=tokenizer),dict(type=EvaluateChatHook,tokenizer=tokenizer,every_n_iters=evaluation_freq,evaluation_inputs=evaluation_inputs,system=SYSTEM,prompt_template=prompt_template)
]# configure default hooks
default_hooks = dict(# record the time of every iteration.timer=dict(type=IterTimerHook),# print log every 100 iterations.logger=dict(type=LoggerHook, interval=10),# enable the parameter scheduler.param_scheduler=dict(type=ParamSchedulerHook),# save checkpoint per epoch.checkpoint=dict(type=CheckpointHook, interval=1),# set sampler seed in distributed evrionment.sampler_seed=dict(type=DistSamplerSeedHook),
)# configure environment
env_cfg = dict(# whether to enable cudnn benchmarkcudnn_benchmark=False,# set multi process parametersmp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),# set distributed parametersdist_cfg=dict(backend='nccl'),
)# set visualizer
visualizer = None# set log level
log_level = 'INFO'# load from which checkpoint
load_from = None# whether to resume training from the loaded checkpoint
resume = False# Defaults to use random seed and disable `deterministic`
randomness = dict(seed=None, deterministic=False)

微調啟動

xtuner train /root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

微調后參數轉換/合并

# 創建用于存放Hugging Face格式參數的hf文件夾
mkdir /root/personal_assistant/config/work_dirs/hfexport MKL_SERVICE_FORCE_INTEL=1# 配置文件存放的位置
export CONFIG_NAME_OR_PATH=/root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py# 模型訓練后得到的pth格式參數存放的位置
export PTH=/root/personal_assistant/config/work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_3.pth# pth文件轉換為Hugging Face格式后參數存放的位置
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf# 執行參數轉換
xtuner convert pth_to_hf $CONFIG_NAME_OR_PATH $PTH $SAVE_PATH

網頁DEMO

安裝依賴

pip install streamlit==1.24.0

下載項目

# 創建code文件夾用于存放InternLM項目代碼
mkdir /root/personal_assistant/code && cd /root/personal_assistant/code
git clone https://github.com/InternLM/InternLM.git

將 /root/code/InternLM/web_demo.py 中 29 行和 33 行的模型路徑更換為Merge后存放參數的路徑 /root/personal_assistant/config/work_dirs/hf_merge

啟動

streamlit run /root/personal_assistant/code/InternLM/web_demo.py --server.address 127.0.0.1 --server.port 6006

運行效果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711611.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebGIS----wenpack

學習資料:https://webpack.js.org/concepts/ 簡介: Webpack 是一個現代化的 JavaScript 應用程序的模塊打包工具。它能夠將多個 JavaScript 文件和它們的依賴打包成一個單獨的文件,以供在網頁中使用。 Webpack 還具有編譯和轉換其他類型文…

自學新標日第六課(單詞部分 未完結)

第六課 單詞 單詞假名聲調詞義來月らいげつ1下個月先月せんげつ1上個月夜中よなか3午夜昨夜ゆうべ0昨天晚上コンサートこんさーと1音樂會クリスマスくりすます3圣誕季誕生日たんじょうび3生日こどもの日こどものひ5兒童節夏休みなつやすみ3…

看待事物的層與次 | DBA與架構的一次對話交流

前言 在計算機軟件業生涯中,想必行內人或多或少都能感受到系統架構設計與數據庫系統工程的重要性,也能夠清晰地認識到在計算機軟件行業中技術工程師這個職業所需要的專業素養和必備技能! 背景 通過自研的數據庫監控管理工具,發現 SQL Server 數據庫連接數在1-2K之間,想…

Yii2中如何使用scenario場景,使rules按不同運用進行字段驗證

Yii2中如何使用scenario場景,使rules按不同運用進行字段驗證 當創建news新聞form表單時: 添加新聞的時候執行create動作。 必填字段:title-標題,picture-圖片,description-描述。 這時候在model里News.php下rules規則…

星座每日運勢 api接口

接口數據api 接口平臺&#xff1a;https://api.yuanfenju.com/ 開發文檔&#xff1a;https://doc.yuanfenju.com/zhanbu/yunshi.html 支持格式&#xff1a;JSON 請求方式&#xff1a;HTTP POST <?php//您的密鑰 $api_secret "wD******XhOUW******pvr"; //請…

利用coze 搭建“全功能“微信客服(2)

緊跟上篇 利用coze 搭建"全功能"微信客服&#xff08;1&#xff09;&#xff0c;不知道來龍去脈自行查閱 先表揚下coze: coze 是國內少數開放平臺之一&#xff0c;里面提供各種插件還可以開發工作流&#xff0c;讓你可以實現多模態全功能大模型 吐槽 沒有API開放接口…

國外最流行的是AI,國內最流行的是AI培訓教程

國外最流行的是AI&#xff0c;國內最流行的是AI培訓教程。 最近李一舟AI教程事件&#xff0c;驗證了這句話。 如今給客戶做方案項目里能加點AI色彩&#xff0c;立項的成功率都變大(特別是事業單位)。 正因如此&#xff0c;大家都在狂補AI的知識&#xff0c;不然肚子里沒點墨水&…

2024亞馬遜全球開店注冊前需要準備什么?

在2023年出海四小龍SHEIN、Temu、速賣通AliExpress、TikTok Shop快速增長擴張&#xff0c;成為了中國跨境賣家“逃離亞馬遜”的新選擇。但是&#xff0c;跨境電商看亞馬遜。當前&#xff0c;亞馬遜仍然是跨境電商行業的絕對老大&#xff0c;占有將近70%成以上的業務份額。 作為…

threejs顯示本地硬盤上的ply文件,通過webapi

由于ply文件是第三方提供的&#xff0c;threejs無法用絕路路徑的方式顯示ply 所以想通過webapi把ply通過url地址的方式給threejs 1.webapi部分 /// <summary>/// 獲取PLY文件/// </summary>/// <returns></returns>[HttpPost(Name "GetPly&qu…

分享fastapi低級錯誤

我是創建表的時候把__tablename__ 寫成__table__然后一直報這個錯誤

Android Activity跳轉詳解

在Android應用程序中&#xff0c;Activity之間的跳轉是非常常見的操作&#xff0c;通過跳轉可以實現不同界面之間的切換和交互。在本篇博客中&#xff0c;我們將介紹Android中Activity跳轉的相關知識&#xff0c;包括基本跳轉、傳遞參數、返回數據以及跳轉到瀏覽器、撥號應用和…

端游如何防破解

在2023年這個游戲大年中&#xff0c;諸多熱門大作涌現&#xff0c;作為世界級IP哈利哈利波特的衍生游戲——《霍格沃茨之遺》毫無懸念地成為2023年游戲圈的首款爆款作品&#xff0c;斬獲了一眾玩家的青睞。 在眾多光環的加持下&#xff0c;《霍格沃茨之遺》很快被著名游戲破解…

【每日前端面經】2024-03-01

題目來源: 牛客 MVVM怎么實現 MVVM分別指View、Model、ViewModel&#xff0c;View通過View-Model的DOM監聽器將事件綁定到Model上&#xff0c;而Model則通過Data Bindings來管理View中的數據&#xff0c;View-Model從中起到一個連接的作用 響應式: vue如何監聽data的屬性變化…

深入 Starknet 去中心化世界,探秘實用開發利器

Starknet 近期開放空投&#xff0c;面向 130 萬地址總量發放超 7 億枚 Token&#xff0c;讓 ECMP 早期貢獻者、GitHub 開源開發者、Starknet 用戶等各個層面的生態參與者都得以深度參與。 盛宴的背后&#xff0c;是 Starknet 正迎來發展的關鍵機遇。在今年以太坊坎昆升級的背景…

從別人的開源項目學習并吸收經驗,然后逐步搭建自己的Java項目是一個很好的學習方法

從別人的開源項目學習并吸收經驗&#xff0c;然后逐步搭建自己的Java項目是一個很好的學習方法。以下是一些建議的步驟&#xff0c;幫助你從0開始搭建并不斷完善自己的Java項目&#xff0c;直至達到高可靠、高穩定、高并發、高數據安全&#xff0c;并可以拆分為微服務的大型高質…

【漏洞復現】某廠商上網行為管理系統static_convert命令執行漏洞

Nx01 產品簡介 天融信上網行為管理系統是天融信公司憑借多年來的安全產品研發經驗&#xff0c;為滿足各行各業進行網絡行為管理和內容審計的專業產品。 Nx02 漏洞描述 天融信上網行為管理系統老版本static_convert.php接口存在RCE漏洞&#xff0c;攻擊者利用此漏洞可以獲取服務…

超強預測算法:XGBoost預測模型

目錄 往期精彩內容&#xff1a; 多變量特征序列、單序列數據預測實戰 前言 1 風速數據預處理與數據集制作 1.1 導入數據 1.2 多變量數據預處理與數據集制作 1.3 單序列數據預處理與數據集制作 2超強模型XGBoost——原理介紹 3 模型評估和對比 3.1 隨機森林預測模型 3…

基于NeRF/Gaussian的全新SLAM算法

什么是SLAM&#xff1f; SLAM&#xff0c;即同時定位與地圖構建技術&#xff0c;SLAM可以讓機器人、無人機和其他自動化系統能夠在未知環境中同時進行自我定位和環境映射。 為什么是NeRF-Based SLAM&#xff1f; 傳統CG將輸入圖像重新投影再融合到新的視圖攝像機中&#xff0c…

InfiniBand 200Gbps QSFP56 高速線纜/光纜和光模塊解決方案

隨著數據中心和人工智能迅速發展&#xff0c;對高速、低延遲和低功耗的數據傳輸需求變得至關重要。飛速&#xff08;FS&#xff09;提供針對各種高性能計算場景量身定制的各種InfiniBand線纜和光模塊產品。本文旨在概述飛速&#xff08;FS&#xff09;200G InfiniBand HDR 光纜…

深圳地鐵12號線綠色出行新時代,格力中央空調助力節能飛躍

深圳地鐵12號線&#xff0c;作為城市交通的重要組成部分&#xff0c;其運行貫穿著前海、南山、寶安、西鄉等多個區域&#xff0c;承載著數以萬計的乘客&#xff0c;是深圳市民出行的重要選擇。在這條城市動脈上&#xff0c;一項革命性的變革正在悄然發生——綠色出行的新時代正…