书生浦语第二期实战营系列—综述加技术报告研读
书生浦语第二期实战营系列—Tutorial1:demo体验
书生浦语第二期实战营系列—Tutorial2:RAG
书生浦语第二期实战营系列—Tutorial3:Xtuner微调
书生浦语第二期实战营系列—Tutorial4:Lmdeploy量化部署
书生浦语第二期实战营系列—Tutorial5:Agent
书生浦语第二期实战营系列—Tutorial6:OpenCompass
书生浦语第二期实战营学习笔记(作业)(第三节课)
1 RAG基础知识
1.1 RAG技术概述
如下图,RAG是检索用户提供的外部知识库,让LLM理解然后生成的一种技术
1.2 向量数据库
首先看下用户输入的向量数据库是怎么构建的,通过word2vec等成熟技术将上传的文本转化为向量,方便计算机存储和相似度检索
1.3 RAG工作原理和流程
1.3.1 RAG工作原理
如下图,主要可以概括为以下三个部分:
1.数据库生成
2.用户输入检索
3.整理数据库检索内容和一些特定的Prompt给LLM生成
1.3.2 RAG工作流程
下面是构建好的RAG使用的流程:用户的输入在向量数据库(知识库)中检索,具体的检索方式就是求相似度:
1.检索到的超过阈值的文本索引出来和prompt提供给LLM,给出回答;
2.未检索到的超过阈值的LLM根据输入和prompt给出回答;
1.4 RAG常见优化方法
上面RAG使用的流程中可以看到,RAG也面临许多问题,例如:本来知识库有的没检索出来 检索效率低等。下面介绍了一些常见的优化方法:
1.5 RAG or Fine-Tuning
1.5.1 RAG vs Fine-Tuning
下面列举了一些RAG和Fine-Tuning各自的优势和局限
1.5.2 RAG 和 Fine-Tuning怎么选
具体是选择RAG还是 Fine-Tuning需要根据我们的实际任务来:
1.需要让LLM具备更多的外部知识库的能力,选择RAG;
2.需要让LLM在执行具体任务是有更强的适应能力,选择 Fine-Tuning;
3.既要1又要2,可以选择RAG和Fine-Tuning;
4.既不那么要1,也不那么要2,可以选择Prompt Engineering;
1.6 RAG的评估
下面是对做好的RAG的一些评估手段
2 RAG应用-茴香豆
2.1 茴香豆的简介
2.2 茴香豆的构建流程
可以看到茴香豆不仅是一个应用,也是一套非常完善的Pipline,它包含了:
1.知识库构建
2.和前端交互
3.和后端交互
2.3 茴香豆工作流
下面是茴香豆的一个完整的工作流:
1.用户输入,用大模型给出输入的keyword;
2.对用户的输入进行理解并打分,是否拒答;
3.不拒答的,分别可以在外部知识库 网页 甚至知识图谱中进行检索;
4.对检索的结果给到LLM进行组织;
5.对LLM的输出进行安全检查,确保安全合规;
2.4 线上茴香豆助手试用
2.4.1 创建知识库
点击链接:https://openxlab.org.cn/apps/detail/tpoisonooo/huixiangdou-web
创建并上传个人知识库,这里找了些猫相关的知识,做成文档
上传个人知识库
2.4.2 试用茴香豆 Web 版(基础作业1)
上传好后就可以和豆哥对话,5轮 截图为证
2.5 在 InternLM Studio 上部署茴香豆技术助手
2.5.1 安装依赖
激活之前已经安装好的环境,安装一些可能会缺的包
conda activate internlm
pip install protobuf==4.25.3 accelerate==0.28.0 aiohttp==3.9.3 auto-gptq==0.7.1 bcembedding==0.1.3 beautifulsoup4==4.8.2 einops==0.7.0 faiss-gpu==1.7.2 langchain==0.1.14 loguru==0.7.2 lxml_html_clean==0.1.0 openai==1.16.1 openpyxl==3.1.2 pandas==2.2.1 pydantic==2.6.4 pymupdf==1.24.1 python-docx==1.1.0 pytoml==0.1.21 readability-lxml==0.8.1 redis==5.0.3 requests==2.31.0 scikit-learn==1.4.1.post1 sentence_transformers==2.2.2 textract==1.6.5 tiktoken==0.6.0 transformers==4.39.3 transformers_stream_generator==0.0.5 unstructured==0.11.2
2.5.2 下载代码
下载茴香豆的源代码,运行后会发现缺少词向量和LLM模型
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
2.5.3 下载词向量包和LLM模型
容器内已经帮我们下载好了,加个软连接吧
# 创建模型文件夹
cd /root && mkdir models
# 复制BCE模型
ln -s /root/share/new_models/maidalun1020/bce-embedding-base_v1 /root/models/bce-embedding-base_v1
ln -s /root/share/new_models/maidalun1020/bce-reranker-base_v1 /root/models/bce-reranker-base_v1
# 复制大模型参数
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b /root/models/internlm2-chat-7b
2.5.4 修改配置文件
这里修改了下config.ini的6、7、 29行
2.5.5 搭建知识库
2.5.5.1 添加语料库
这里采用huixiangdou自己的github文档作为检索语料
cd /root/codes/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
2.5.5.2 修改接受和拒答列表
茴香豆非常人性化给知识助手添加了接受和拒答的列表,用于表示希望知识助手回答和拒绝闲聊的问题列表
将后面作业用到的【 茴香豆怎么部署到微信群 】写到good_questions.json防止助手拒答
创建一个测试用的问询列表,测试拒答流程是否起效
cd /root/huixiangdou
echo '[
"huixiangdou 是什么?",
"你好,介绍下自己"
]' > ./test_queries.json
2.5.5.3 创建检索向量数据库
# 创建向量数据库存储目录
cd /root/codes/huixiangdou && mkdir workdir
# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json
2.5.6 运行茴香豆知识助手(基础作业2)
修改/root/codes/huixiangdou/huixiangdou/main.py 74 为作业需求的 【 茴香豆怎么部署到微信群 】实际上是【 你好, 茴香豆怎么部署到微信群 】,能给出较好的结果,提问的方式影响挺大的,看来提问得有礼貌。。。
# 运行茴香豆
cd /root/codes/huixiangdou/
python3 -m huixiangdou.main --standalone
茴香豆回答如下,截图为证
2.6 将茴香豆部署到微信群(进阶作业A)
2.6.1 创建知识库
这里使用2.4.1相同的知识库
2.6.2 编译茴香豆的安卓app
目前用的微信版本为最新的8.0.48,预编译的apk支持8.0.47,使用预编译的版本,豆哥无动于衷
需要把最新huixiangdou仓库里面的代码,按官方的提示填上8.0.48,重新编译茴香豆的安卓app,安装在安卓设备上
地址:https://github.com/InternLM/HuixiangDou/tree/main/android
2.6.3 点击部署到微信,复制回调地址
2.6.4 设置的茴香豆app
把2.6.3复制的回调链接拷贝到安卓app里面,按【点我】将茴香豆扫描屏幕的权限打开
2.6.5 运行效果
保持茴香豆后台运行,让群聊的小伙伴发问,等了一会,豆哥开始工作了,回答得挺到位,截图为证(这个截图是上图打开调试模式的时候回复的)
3 langChain搭建RAG
这是之前熟悉的langChain搭建RAG的知识,作为笔记将它记录在此
3.1 langChain环境配置
pip install langchain==0.0.292
pip install gradio==4.4.0
pip install chromadb==0.4.15
pip install sentence-transformers==2.2.2
pip install unstructured==0.10.30
pip install markdown==3.3.7
3.2 资源下载
3.2.1 词向量模型下载
Embedding的时候需要词向量模型
pip install -U huggingface_hub
建立Python文件
import os
# 下载模型
os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/data/model/sentence-transformer')
--resume-download:断点续下;
--local-dir:本地存储绝对路径
上面有可能会出现,,需要使用HF的镜像
Terminal中输入
export HF_ENDPOINT=https://hf-mirror.com
python down.py
3.2.2 下载 NLTK 相关资源
构建词向量的时候需要数据资源,这里同样使用国内的镜像仓库
git clone https://gitee.com/yzy0612/nltk_data.git --branch gh-pages
cd nltk_data
mv packages/* ./
cd tokenizers
unzip punkt.zip
cd ../taggers
unzip averaged_perceptron_tagger.zip
因为后面还会遇到nltk_data数据加载的问题,nltk_data默认的地方找不到数据,可以在其中一个位置做上软连接
ln -s xxx/nltk_data /home/xxx/nltk_data
第一个xxx为上面clone的位置
第二个xxx为当前用户的名字
3.2.3 下载 项目代码
git clone https://github.com/InternLM/tutorial
3.3 构建知识库
这里用InternLM相关的工具开源仓库作为知识库
# clone 上述开源仓库
git clone https://gitee.com/open-compass/opencompass.git
git clone https://gitee.com/InternLM/lmdeploy.git
git clone https://gitee.com/InternLM/xtuner.git
git clone https://gitee.com/InternLM/InternLM-XComposer.git
git clone https://gitee.com/InternLM/lagent.git
git clone https://gitee.com/InternLM/InternLM.git
#代码修改
tutorial/langchain/demo/create_db.py
44行
code_root = xxx
# 目标文件夹
tar_dir = [
code_root+"/InternLM",
code_root+"/InternLM-XComposer",
code_root+"/lagent",
code_root+"/lmdeploy",
code_root+"/opencompass",
code_root+"/xtuner"
]
66行
# 加载开源词向量模型
embeddings = HuggingFaceEmbeddings(model_name="xxx/sentence-transformer")
运行脚本
python tutorial/langchain/demo/create_db.py
3.4 运行效果
修改代码xxx/tutorial/langchain/demo/run_gradio.py
def load_chain():
# 加载问答链
# 定义 Embeddings
embeddings = HuggingFaceEmbeddings(model_name="xxx/sentence-transformer")
# 向量数据库持久化路径
persist_directory = 'xxx/tutorial/langchain/data_base/vector_db/chroma'
# 加载数据库
vectordb = Chroma(
persist_directory=persist_directory, # 允许我们将persist_directory目录保存到磁盘上
embedding_function=embeddings
)
llm = InternLM_LLM(model_path = "xxx/internlm2-chat-7b/")
# 你可以修改这里的 prompt template 来试试不同的问答效果
template = """请使用以下提供的上下文来回答用户的问题。如果无法从上下文中得到答案,请回答你不知道,并总是使用中文回答。
提供的上下文:
···
{context}
···
用户的问题: {question}
你给的回答:"""
QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],
template=template)
# 运行 chain
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm,
retriever=vectordb.as_retriever(),
return_source_documents=True,
chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
return qa_chain
python tutorial/langchain/demo/run_gradio.py
问些知识库里面的东西,效果如下:
参考链接:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md
https://github.com/InternLM/Tutorial/blob/main/langchain/readme.md