课程视频链接:
茴香豆:搭建你的 RAG 智能助理_哔哩哔哩_bilibili
课程文档:
https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md
茴香豆RAG 助手解决的问题:
1. 知识更新太快,语料太大、难以处理对LLM是很大的挑战,RAG本地知识库可以很好的解决这些问题。RAG不需要经过训练,就可以很好的回答特定的问题。
2. RAG 检索增强生成,通过利用外部知识库来增加LLM的能力。
3. RAG 很好的解决了LLMS处理只是密集型任务是遇到的挑战。可以提供准确的回答,降低成本,实现外部记忆。
4. RAG解决LLM的幻觉、过时的知识和缺乏透明和可追溯的推理过程
RAG工作原理:
1. indexing(索引):将知识源(文档、网页等)分割成chunk,编码成向量存储在向量数据库中。
2. Retrieval(检索):将接受到的用户的问题编码成向量,并在向量数据库中查找与之相关的文档快(trunk)
3. Generation(生成):将检索到的文档块和原始问题一起作为提示(prompt)输入到LLM中,生成最终的回答
向量数据库(Vector-DB):
数据存储:将文本或其他数据通过预训练的模型转换为固定长度的向量表示,这些向量能够捕捉文本的语义信息。
相似性检索:根据用户提供的查询向量,使用向量数据库快速查找出最相关的向量的过程。通过计算余弦相似度来完成。检索结果根据相似度排序,最相关的文档将被用于后继的文本生成。
向量表示的优化:通过使用更高级的技术来支持大规模的向量搜索。
RAG流程示例:
RAG优化方法:
嵌入式优化(embeding optimization):结合稀疏和密集检索;多任务
索引优化(indexing optimization): 细粒度分割;元数据
查询优化(Query optimization): 查询扩展、转换;多查询
上下文管理(Context Curation):重排;上下文选择/压缩
迭代检索(Iterative Retrieval):根据初始查询和最近生成的文本进行重复的搜索
递归检索(recursive retrieval):迭代细化搜索查询;链式推理指导检索过程
自适应检索(Adaptive Retrieval):Flare,Self-RAG;使用LLMs主动决定检索的最佳时机和内容
LLM微调(Fine-tuning):检索微调;生成微调;双重微调
RAG vs Fine-tuning
RAG的优势:
- 非参数记忆,利用外部知识库提供实时更新的信息。
- 能够处理知识密集型的任务,提供准确的事实性回答。
- 通过检索增强,可以生成更多样化的内容。
RAG的适用场景:
- 适合结合最新的信息和实时数据的任务:开放式问答,实时新闻等
RAG的优势:
- 动态处理知识更新,处理长尾知识问题
RAG的局限:
- 依赖于外部知识库的质量和覆盖范围,依赖大模型的能力
Fine-Tuning:
- 参数记忆,通过在特定任务数据上训练,模型可以更好的适应该任务。
- 通过需要大量标注数据来进行有效的微调。
- 微调后的模型可能会导致泛化能力的下降
Fine-tuning使用场景:
- 适用于数据可用且需要模型高度专业化的任务,例如特定领域的文本分类、情感分析、文本生成。
Fine-tuning优势:
- 模型性能针对特定任务优化
Fine-tuning局限:需要大量标注数据,对新任务适应较差
茴香豆介绍
茴香豆是书生蒲语团队开发的基于LLM的领域知识助手。
- 转为即时通讯工具中的群聊场景优化的工作流,提供及时准确的技术支持和自动回答服务。
- 通过应用检索增强生成技术,能够理解和高效准确的回应与特定知识领域相关的复杂查询。
茴香豆的核心特性:
- 开源免费:免费商用
- 高效准确:专为群聊优化
- 领域知识:应用RAG技术,专业知识快速获取
- 部署成本低:无需额外训练,可以利用云端模型API,本地算力需求少
- 安全:保护数据和隐私
- 扩展性强: 兼容多种IM软件,支持多种开源LLMS和云端API
茴香豆的构建:
1. 知识库:MD、PDF,TXT,PPT,DOCX
2. 前端:wecat,飞书等
3. llm:本地(InternLLM2,千问)或远端API(KIMI,chatgpt等)
4. 豆哥
茴香豆的工作流:
亮点:拒答工作流
豆哥的能力:
多来源检索:向量数据库、网络搜索结果、知识图谱
混合大模型:本地和远程
多重评分:回答有效、避免信息泛滥
安全检查:多种手段,确保合规
作业:
1. 在茴香豆 Web 版中创建自己领域的知识问答助手
- 参考视频零编程玩转大模型,学习茴香豆部署群聊助手
- 完成不少于 400 字的笔记 + 线上茴香豆助手对话截图(不少于5轮)
上传文档
提问
- 内容提炼和汇总功能很棒
2. 文档知识点挖掘
3. 回答有理有据
4. 没有出现幻觉,因为知识库没有包含博通和VM的关系,所以回答还算满意
5. 辅助学习针对有用
茴香豆搭建:
1.1 配置基础环境
进入开发机后,从官方环境复制运行 InternLM 的基础环境,命名为 InternLM2_Huixiangdou
,在命令行模式下运行
studio-conda -o internlm-base -t InternLM2_Huixiangdou
安装成功显示
复制完成后,在本地查看环境
运行 conda 命令,激活 InternLM2_Huixiangdou
python 虚拟环境:
1.3 下载安装茴香豆
安装茴香豆运行所需依赖
pip install -r requirements.txt 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
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
2 使用茴香豆搭建 RAG 助手
2.1 修改配置文件
用已下载模型的路径替换 /root/huixiangdou/config.ini
文件中的默认模型,需要修改 3 处模型地址,分别是:
命令行输入下面的命令,修改用于向量数据库和词嵌入的模型
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
用于检索的重排序模型
2.2 创建知识库
本示例中,使用 InternLM 的 Huixiangdou 文档作为新增知识数据检索来源,在不重新训练的情况下,打造一个 Huixiangdou 技术问答助手。
首先,下载 Huixiangdou 语料:
cd /root/huixiangdou && mkdir repodir git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
提取知识库特征,创建向量数据库。数据库向量化的过程应用到了 LangChain 的相关模块,默认嵌入和重排序模型调用的网易 BCE 双语模型,如果没有在 config.ini
文件中指定本地模型路径,茴香豆将自动从 HuggingFace 拉取默认模型。
除了语料知识的向量数据库,茴香豆建立接受和拒答两个向量数据库,用来在检索的过程中更加精确的判断提问的相关性,这两个数据库的来源分别是:
- 接受问题列表,希望茴香豆助手回答的示例问题
- 存储在
huixiangdou/resource/good_questions.json
中
- 存储在
- 拒绝问题列表,希望茴香豆助手拒答的示例问题
- 存储在
huixiangdou/resource/bad_questions.json
中 - 其中多为技术无关的主题或闲聊
- 如:"nihui 是谁", "具体在哪些位置进行修改?", "你是谁?", "1+1"
- 存储在
运行下面的命令,增加茴香豆相关的问题到接受问题示例中:
再创建一个测试用的问询列表,用来测试拒答流程是否起效:
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
2.3 运行茴香豆知识助手
我们已经提取了知识库特征,并创建了对应的向量数据库。现在,让我们来测试一下效果:
命令行运行:
# 填入问题 sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py # 运行茴香豆 cd /root/huixiangdou/ python3 -m huixiangdou.main --standalone