一、 大模型开发范式
- LLM的局限性
- 知识时效性受限
- 专业能力有限
- 定制化成本高
- 开发范式
(1)RAG 检索增强生成
a. 给大模型外挂一个知识库,从知识库中匹配到回到文档,然后一起交给大模型
b. 低成本、可实时更新、受基座模型影响大、单次回答知识有限(多次总结性回答表现差)
(2)Finetune 微调
a. 在新的较小的数据集上进行轻量级训练微调
b. 可个性化微调、知识覆盖面广、成本高昂、无法实时更新
二、 LangChain简介——如何高效开发一个RAG应用
- LangChain框架是一个开源工具,通过各种LLM提供通用接口来简化应用程序的开发流程,帮助开发者自由构建LLM应用。
- 核心组成模块
- Chains:将组件组合实现端到端应用,通过一个对象封装实现一系列LLM操作
- 检索问答链:将大模型、向量数据库等多个组件组合在一起,覆盖实现了RAG的全部流程
- 基于LangChain搭建RAG应用
三、 构建向量数据库
加载源文件 -> 文档分块 -> 文档向量化
- 加载源文件:核心在于将带个是的文本转化为无格式的字符串
- 文档分块:单个文档往往超过模型上下文长度的上限,需要对加载的文档进行切分。
- 一般按照字符长度进行分割
- 可以手动控制分割块的长度和重叠区间长度
- 使用向量数据库来知识语义检索,需要将文档向量化存入向量数据库
- 可以使用任一一种Embedding模型来进行向量化
- 可以使用多种支持语义检索的向量数据库,一般使用轻量级的Chroma
四、 搭建知识库助手
- 将InternLM接入LangChain
- LangChain支持自定义LLM,可以直接接入到框架中。我们可以将InternLM部署在本地,并封装一个自定义LLM类,调用本地InternLM即可。
- 构建检索问答链
- LangChain提供了检索问答链模板,可以自动实现知识检索、Prompt嵌入、LLM问答的全部流程
- 将基于InternLM的自定义LLM和以构建的向量数据库接入到检索问答链的上游
- 调用检索问答链,即可实现知识库助手的核心功能。
-
RAG方案优化建议
-
基于RAG的问题系统的核心性能受限于:检索精度、Prompt性能
-
一些可能的优化点:
-
检索方面:基于语义进行分割,保证每个chunk的语义完整;给每一个chunk生成概括性索引,检索时匹配索引
-
Prompt方面:迭代优化Prompt策略
-
-
五、 Web Demo部署
- 支持简易Web部署的框架:Gradio、Streamlit等
六、 动手实战
Tips:
hugging-face下载也可也在python文件中修改镜像:
#设置环境变量
os.environ['HF_ENDPOINT']='https://hf-mirror.com'
作业
一、 基础作业:复现课程知识库助手搭建过程 (截图)
1、知识库搭建
(1)数据收集
a. 数据集:选择openCompass, IMDepoly, XTuner, InternLM-XComposer, Lagent, InternLM
b. 数据处理:提取所有md,txt为后缀的文件,返回一个文件列表
(2)加载数据
使用LangChain提供的FileLoader对象来加载目标文件:
loader = UnstructuredMarkdownLoader(one_file)
docs.extend(loader.load())
之后,得到的docs为一个纯文本对象对应的列表
(3)构建向量数据库
a. 对文本进行分块:
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=150)
split_docs = text_splitter.split_documents(docs)
b. 选用开源词向量模型Sentence Transformer来进行文本向量化
embeddings = HuggingFaceEmbeddings(model_name="xxx")
c. 选择Chrma作为向量数据库,基于上下文分块后的文档以及加载的开源向量化模型,将语料库加载到指定路径下的向量数据库
vectordb = Chroma.from_documents(documents=split_docs, embedding=embeddings, persist_directory="持久化路径")
vectordb.persist()
2、InternLM 接入LangChain
(1)基于本地部署InternLM,集成LangChain的LLM类自定义的一个InternLM LLM子类,从而实现将InternLM接入到LangChain框架中。
(2)之后,以完全一致的方式调用LangChain接口
3、构建检索问答链
(1)加载向量数据库
embeddings = HuggingFaceEmbeddings()
vectordb = Chroma(persist_directory="持久化路径", embedding_function=embeddings)
vectordb对象即为已构建的向量数据库对象,该对象可以针对用户的query进行语义上的向量检索,得到与用户提问相关的知识片段
(2)实例化自定义LLM与Prompt Template
llm = InternLM_LLM(model_path="xxx")
QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context", "question"],template=template)
(3)构建检索问答链
(4)
qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectordb.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
(5)部署Web Demo
(6)结果:
二、 进阶作业:选择一个垂直领域,收集该领域的专业资料构建专业知识库,并搭建专业问答助手,并在 OpenXLab 上成功部署(截图,并提供应用地址)
- 知识库搭建
知识库taoli:一个在国际中文教育领域数据上进行了额外训练的模型
- InternLM 接入LangChain
- 构建检索问答链
- 部署web Demo
- 结果: