茴香豆:搭建你的 RAG 智能助理_哔哩哔哩_bilibili
目录
前言
训练好的LLM对于新增的知识或概念无法进行回答(如:茴香豆助手),这时如果先收集数据然后通过微调等方式对模型进行再训练会遇到各种问题(如:知识更新太快,知识库太大,训练成本高),而使用RAG,直接将相关的信息从语料库里检索出来作为上下文输入给模型作为新增知识,简单快捷
RAG概述
RAG全名检索增强生成,结合检索和生成,利用外部知识库增强LLM的性能,通过检索与输入相关的信息片段,结合这些信息使得生成的回答更准确更丰富,可以改善幻觉,知识过时等问题
工作原理
将知识(文字或图片都可以)分块,编码成向量存在向量数据库里,输入的prompt也编码成向量,根据相似度找到相关内容后和原始prompt一起给LLM进行输出
向量数据库
数据:文本的向量表示,检索:向量相似度计算,优化:编码优化和数据库检索优化
RAG常见优化方法
嵌入优化(稀疏和密集检索 多任务),索引优化(细粒度分割 元数据),查询优化(查询扩展转换 多查询),上下文管理(重排 上下文选择/压缩),迭代检索(根据初始查询和生成的文本重度搜索),递归检索(迭代细化搜索查询,CoT指导检索),自适应检索(flare,self-RAG,使用LLM决定检索的时机和内容),LLM微调(检索 生成 双重微调)
RAG vs. 微调
RAG: 处理知识密集任务,用于知识更新快的任务,动态更新知识,处理长尾问题,要求外部知识库保证一定质量和覆盖范围,同时LLM能力不能太差
微调:特定任务上能够更好地适应,但是需要比较多的数据,微调后可能过拟合或者遗忘,适用于特定领域内高度专业化的任务(比如:甲骨文文本分类?)
RAG 评估和测试基准
RAG 应用案例(茴香豆)
介绍
基于LLM的领域知识助手,专为即时通讯工具中的群聊场景优化,提供准确的技术支持和自动问答,通过RAG 使得LLM理解并准确的回答特定领域相关的问题,应用场景为群聊智能客服,能在群组里解答问题
群聊客服的难点:信息量多且杂,内容不定,需要准确实时的解答且专业性强,这种场景如果训练数据不够微调模型收益不高且实时性差
工作流
预处理:用户输入转换为合适的prompt
拒答:根据输入的prompt进行分析和数据库内容比较决定是否回复
应答:根据输入和检索的信息回复
应答模块,除了向量数据库还能通过网络或知识图谱检索,LLM可以是本地的也可以是远程的,多种检查如果LLM检查 NLP检查 时间检查 撤回等保证输出安全
实践
1.配置环境
需要的模型 internlm2-chat-7 bce-embedding-base_v1 bce-reranker-base_v1
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
# 克隆代码仓库
cd /root
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout ded0551
2.修改配置文件
#修改用于向量数据库和词嵌入的模型
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
#用于检索的重排序模型
sed -i '7s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/huixiangdou/config.ini
#llm, 文件的第29行内容替换为local_llm_path = "/root/models/internlm2-chat-7b"
sed -i '29s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/huixiangdou/config.ini
3.创建知识库
使用 InternLM 的 Huixiangdou 文档作为新增知识数据检索来源,在不重新训练的情况下,打造一个 Huixiangdou 技术问答助手
下载 Huixiangdou 语料
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
数据库向量化的过程应用到了 LangChain 的相关模块,默认嵌入和重排序模型调用的网易 BCE 双语模型, 就是上面 bce-embedding-base_v1 bce-reranker-base_v1
建立接受和拒答向量数据库,更加精确的判断提问相关性
接受问题列表,希望茴香豆助手回答的示例问题,存储在 huixiangdou/resource/good_questions.json
中
拒绝问题列表,希望茴香豆助手拒答的示例问题,存储在 huixiangdou/resource/bad_questions.json
中,其中多为技术无关的主题或闲聊
echo '[
"huixiangdou 能部署到微信吗?",
"huixiangdou 怎么应用到飞书",
"huixiangdou 能部署到微信群吗?",
"huixiangdou 怎么应用到飞书群",
]' > /root/huixiangdou/resource/good_questions.json
创建一个测试用的问询列表,用来测试拒答流程是否起效:
cd /root/huixiangdou
echo '[
"huixiangdou 是什么?",
"你好,介绍下自己"
]' > ./test_queries.json
创建 RAG 检索过程中使用的向量数据库:
# 创建向量数据库存储目录
cd /root/huixiangdou && mkdir workdir
# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json
向量数据库创建过程比较慢,完成后,Huixiangdou 相关的新增知识就以向量数据库的形式存储在 workdir
文件夹下。
检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。
确定的回答的问题会利用基础模型提取关键词(非得先提取关键词?),在知识库中检索 top K
相似的 chunk
,综合问题和检索到的 chunk
生成答案。
运行
回答问题:"茴香豆怎么部署到微信群"
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
上面那个sed -i是把那几个问题写到main.py里面了,这样standalone运行的时候就会看到相应的输出
END