LLM的局限性:
- 知识时效性受限➡️如何快速更新知识库?
- 专业能力有限➡️如何打造垂域模型?
- 定制化成本高➡️如何实现个性化?
在此背景下产生两种开发范式:RAG(检索增强生成) vs Finetune
RAG的原理如上图所示:
- word转化为向量
- 查找与向量化的提问相似的知识
- 将用户的输入和相似的知识一起嵌入提示词并提交给LLM
- unstructured loader将本地文档统一转化为纯文本格式
- sentence transformer将知识文本段向量化,并存储在向量数据库
- 向量相似度计算和匹配
- ......
- 根据文件类型选择正确的加载器
- 文档切分,防止耽搁文档超出LLM的token限制
- 文档向量化并存储(Chroma VectorDB)
教学视频:Link
-
InternLM模型部署环境配置
-
下载InternLM-chat-7B模型
-
LangChain相关环境配置
-
下载 NLTK 相关资源
我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 nltk 的一些资源
正常情况下,其会自动从互联网上下载,但可能由于网络原因会导致下载中断,此处我们可以从国内仓库镜像地址下载相关资源,保存到服务器上。
可以使用下图中的代码,通过
wget
指令手动下载punkt和averaged_perceptron_tagger也可以使用如下代码进行下载:
cd /root 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
指导文档:Link
-
数据收集
-
加载数据
根据目标文件的类型使用LangChain中不同的文件加载组件,例如使用
UnstructuredMarkdownLoader
加载.md文件 -
构建向量数据库
- 需要使用LangChain的
RecursiveCharacterTextSplitter
组件对文档进行分块(chunk) - 使用
HuggingFaceEmbeddings()
函数加载开源词向量模型 - 使用
vectordb = Chroma.from_documents(...)
函数加载向量数据库 - 使用
vectordb.persist()
持久保存向量数据库
- 需要使用LangChain的
-
将InternLM 接入 LangChain
-
加载向量数据库
- 加载词向量模型
- 加载向量数据库
-
实例化自定义 LLM 与 Prompt Template
-
构建检索问答链
使用
RetrievalQA.from_chain_type()
函数构建问答链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} )
-
其中
as_retriever()
返回向量数据库的检索对象,return_source_documents=True
使每次检索的片段也被返回,在chain_type_kwargs
中定义prompt模板 -
每次调用
qa_chai()
即可实现问答链的使用
-
参考:Link
具体略