书生·浦语大语言模型——基于InternLM和LangChain搭建你的知识库

一、 大模型开发范式

  1. LLM的局限性
    1. 知识时效性受限
    2. 专业能力有限
    3. 定制化成本高
  2. 开发范式

(1)RAG 检索增强生成

a. 给大模型外挂一个知识库,从知识库中匹配到回到文档,然后一起交给大模型

b. 低成本、可实时更新、受基座模型影响大、单次回答知识有限(多次总结性回答表现差)

(2)Finetune 微调

a. 在新的较小的数据集上进行轻量级训练微调

b. 可个性化微调、知识覆盖面广、成本高昂、无法实时更新

二、 LangChain简介——如何高效开发一个RAG应用

  1. LangChain框架是一个开源工具,通过各种LLM提供通用接口来简化应用程序的开发流程,帮助开发者自由构建LLM应用。
  2. 核心组成模块
    1. Chains:将组件组合实现端到端应用,通过一个对象封装实现一系列LLM操作
    2. 检索问答链:将大模型、向量数据库等多个组件组合在一起,覆盖实现了RAG的全部流程
  3. 基于LangChain搭建RAG应用

三、 构建向量数据库

加载源文件 -> 文档分块 -> 文档向量化

  1. 加载源文件:核心在于将带个是的文本转化为无格式的字符串
  2. 文档分块:单个文档往往超过模型上下文长度的上限,需要对加载的文档进行切分。
    1. 一般按照字符长度进行分割
    2. 可以手动控制分割块的长度和重叠区间长度
  3. 使用向量数据库来知识语义检索,需要将文档向量化存入向量数据库
    1. 可以使用任一一种Embedding模型来进行向量化
    2. 可以使用多种支持语义检索的向量数据库,一般使用轻量级的Chroma

四、 搭建知识库助手

  1. 将InternLM接入LangChain
    1. LangChain支持自定义LLM,可以直接接入到框架中。我们可以将InternLM部署在本地,并封装一个自定义LLM类,调用本地InternLM即可。
  2. 构建检索问答链
    1. LangChain提供了检索问答链模板,可以自动实现知识检索、Prompt嵌入、LLM问答的全部流程
    2. 将基于InternLM的自定义LLM和以构建的向量数据库接入到检索问答链的上游
    3. 调用检索问答链,即可实现知识库助手的核心功能。
  3. RAG方案优化建议

    1. 基于RAG的问题系统的核心性能受限于:检索精度、Prompt性能

    2. 一些可能的优化点:

      1. 检索方面:基于语义进行分割,保证每个chunk的语义完整;给每一个chunk生成概括性索引,检索时匹配索引

      2. Prompt方面:迭代优化Prompt策略

五、 Web Demo部署

  1. 支持简易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 上成功部署(截图,并提供应用地址)

  1. 知识库搭建

知识库taoli:一个在国际中文教育领域数据上进行了额外训练的模型

  1. InternLM 接入LangChain
  2. 构建检索问答链
  3. 部署web Demo
  4. 结果:

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值