大模型项目与原理解析
大模型项目分类
初学者可以尝试的LLM项目
Prompt项目
调用开源大模型,修改prompt
prompt+web开发项目优秀案例:ChatPaper
项目概述:以修改Prompt为主要方式,对领域论文(arxiv上)进行翻译概括总结,省去了人工阅读文本的时间。
核心代码功能:输入论文pdf形式,pdf转文本,文本切片,文件处理等
开源链接:https://github.com/kaixindelele/ChatPaper
其他项目:
-
ChatBI、ChatExcel:使用文字给出代码(处理excel文件)或者读取excel
-
ChatPPT、ChatMind:PPT是一种文件格式,使用代码操控ppt文件
如果处理数据很多,超过token限制怎么办?
这里具体指输入文本太长,超过大模型一次输入最多token限制
Embedding
Embedding是将文本、图像等人类世界的高维信息转换为低维向量,同时保留不错的语义信息,便于进行数学运算和相似度比较。
LLM入门项目:
-
三体检索问答
-
prompt优化与并发
-
实现简单的ChatExcel
https://github.com/JessyTsui/awesome_LLM_beginner
现状:Embedding模型偏少,一般使用open ai embedding模型或者智源BGE Embedding模型(通用知识embedding模型),专业领域缺少。
对于专业领域,最好训练自己的Embedding模型
Chatlaw
https://huggingface.co/datasets/PandaVT/chinese_verdict_examples
https://huggingface.co/datasets/PandaVT/chinese_law_examples
一些其它问题
通用模型、垂直模型,我们需要的模型
-
通用模型:能处理10w个子任务的模型 很多
-
垂直模型:能处理3W个子任务的模型 少一点
-
我们需要的模型:能解决3位数以内的模型足够了
“好”数据哪里来?
根据实际场景,做一些数据集出来
实例项目
智能编程助手
项目简述
使用NLP技术对用户指令进行理解,基于源2B大模型作为服务端,以Streamlit开发为实现方式的客户端,最终能够实现多种编程语言的识别与分析,对代码提出改进意见与生成。
核心代码
# 导入所需的库
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import streamlit as st
# 创建一个标题和一个副标题
st.title("💬 Yuan2.0 智能编程助手")
# 源大模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('IEITYuan/Yuan2-2B-Mars-hf', cache_dir='./')
# 定义模型路径
path = './IEITYuan/Yuan2-2B-Mars-hf'
# 定义模型数据类型
torch_dtype = torch.bfloat16 # A10
# torch_dtype = torch.float16 # P100
# 定义一个函数,用于获取模型和tokenizer
@st.cache_resource
def get_model():
print("Creat tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(path, add_eos_token=False, add_bos_token=False, eos_token='<eod>')
tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)
print("Creat model...")
model = AutoModelForCausalLM.from_pretrained(path, torch_dtype=torch_dtype, trust_remote_code=True).cuda()
return tokenizer, model
# 加载model和tokenizer
tokenizer, model = get_model()
# 初次运行时,session_state中没有"messages",需要创建一个空列表
if "messages" not in st.session_state:
st.session_state["messages"] = []
# 每次对话时,都需要遍历session_state中的所有消息,并显示在聊天界面上
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
# 如果用户在聊天输入框中输入了内容,则执行以下操作
if prompt := st.chat_input():
# 将用户的输入添加到session_state中的messages列表中
st.session_state.messages.append({"role": "user", "content": prompt})
# 在聊天界面上显示用户的输入
st.chat_message("user").write(prompt)
# 调用模型
prompt = "<n>".join(msg["content"] for msg in st.session_state.messages) + "<sep>" # 拼接对话历史
inputs = tokenizer(prompt, return_tensors="pt")["input_ids"].cuda()
outputs = model.generate(inputs, do_sample=False, max_length=1024) # 设置解码方式和最大生成长度
output = tokenizer.decode(outputs[0])
response = output.split("<sep>")[-1].replace("<eod>", '')
# 将模型的输出添加到session_state中的messages列表中
st.session_state.messages.append({"role": "assistant", "content": response})
# 在聊天界面上显示模型的输出
st.chat_message("assistant").write(response)
项目效果
特别鸣谢
Datawhale AI 夏令营
感谢分享嘉宾:崔家熙大佬
第一次发文,有任何问题欢迎指正