基于本地知识库的私有 GPT 助手定制教程
本文探讨了基于本地知识库的私有 GPT 助手定制方案。文章对比了全参数训练、微调及基于 Prompt 上下文(RAG)三种技术路径,指出 RAG 方案在平衡成本与效果上的优势。详细讲解了 Embedding 嵌入技术、文本分割策略及完整的检索增强生成流程。最后提供了基于 LangChain 的代码实现示例,并针对语料质量、分割算法及模型选择提出了优化建议,旨在帮助开发者构建垂直领域的智能问答系统。

本文探讨了基于本地知识库的私有 GPT 助手定制方案。文章对比了全参数训练、微调及基于 Prompt 上下文(RAG)三种技术路径,指出 RAG 方案在平衡成本与效果上的优势。详细讲解了 Embedding 嵌入技术、文本分割策略及完整的检索增强生成流程。最后提供了基于 LangChain 的代码实现示例,并针对语料质量、分割算法及模型选择提出了优化建议,旨在帮助开发者构建垂直领域的智能问答系统。

目前大语言模型(LLM)的能力已经非常强大,ChatGPT 等通用模型可以很好地解决日常通用型问题。然而,在处理垂直专业领域的问题时,通用模型往往表现不够理想。如果希望利用 LLM 结合已有的特定领域知识,推理出该领域特定问题的答案,将是一种极具价值的应用方向。
例如,在医疗领域或法律领域,通用的问答助手可能缺乏专业知识,无法提供准确的回答。因此,我们需要实现自己的私有 GPT 助手,使其具备特定领域的专业知识。
假设我们已经拥有了所在特定领域的数据集,比如积累或收集到的医疗数据、金融数据等。经过调研和测试,目前通常有三种实现方案。
全参数训练是将我们自己的数据集与现有 LLM 大模型数据一起进行训练,从而生成一个新的模型。这种方式需要大量的计算资源,如高性能 GPU,显存消耗巨大,通常需要几十 GB 的显存起步。
缺点:
目前流行的微调方法是 LoRA(Low-Rank Adaptation)。其基本原理是额外训练一个小模型(仅几 MB 大小),叠加在原有大模型的基础上,类似于一个特定领域的补丁。
优点: 在特定领域确实有不错的效果。例如,可以使用《甄嬛传》台词脚本训练出的机器人模仿角色语气回答问题。
缺点: 实际测试中会遇到'遗忘'问题。微调后的问答助手可能会丧失原有大模型的通用能力,导致原本能回答的通用问题效果变差。这种修修补补的方式在平衡通用性与专业性上存在挑战。
Prompt 上下文,即提示词,是在要求大模型回答问题时给出一定的要求、语境、提示等,使之得到符合我们要求的答案。我们可以把这种提示想象成球员身边的教练,有了教练的提示,球员一般也能发挥得更好。
示例:
通过将本地知识以 Prompt 的形式喂给大模型,可以实现回答特定垂直领域问题的需求。但是,这种方案有一个比较大的限制:大模型 LLM 对输入长度有限制。例如,ChatGPT 普遍有 4096 个 token 的限制。如果本地知识文档很大,无法全部喂给大模型。
解决方案: 通过搜索将问题中的关键字与本地知识库进行匹配,找到相关度比较高的部分,然后将这些长度有限、相关度高的信息作为大模型的 Prompt。
该方案的核心在于如何通过问题在本地知识库中搜索出相关知识。单纯的关键词搜索往往难以匹配语义相似但字面不同的信息。例如,'上海有什么好吃的?'与文档中的'上海美食介绍'在语义上接近,但关键词硬性搜索可能失效。
在自然语言处理(NLP)中,有一种称为 Embedding(嵌入)的方式来解决语义相似性问题。
Embedding 是将高维数据(如文字、图像)转化为低维数字的过程。其特性是'相似的事物'由相近的数表示。通过 OpenAI 提供的 embedding 模型(如 text-embedding-ada-002),可以将文本转换为向量,便于在低维度层面进行比较。
在实际搜索前,需要将文档切分成一个个的段落。因为无论是提交给 LLM 还是 Embedding 模型,文本长度都有限制。
常用的分割方式包括:
目前已有一些开源项目实现了本地知识库功能,如 langchain-ChatGLM、闻达(Wenda)项目等。在实际测试中,影响效果的因素主要包括:
为了实现上述流程,可以使用 LangChain 框架结合 Python 进行开发。以下是一个简化的实现逻辑:
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import HuggingFacePipeline
# 1. 加载文档
loader = DirectoryLoader('./knowledge_base', glob="**/*.txt")
docs = loader.load()
# 2. 文本分割
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = splitter.split_documents(docs)
# 3. 创建 Embedding 和向量库
embeddings = HuggingFaceEmbeddings(model_name="text-embedding-ada-002")
vectorstore = FAISS.from_documents(splits, embeddings)
# 4. 初始化 LLM
llm = HuggingFacePipeline.from_model_id(
model_id="THUDM/chatglm-6b",
task="text-generation",
pipeline_kwargs={"max_new_tokens": 512}
)
# 5. 构建 QA 链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 6. 查询
query = "如何治疗感冒?"
result = qa_chain({"query": query})
print(result["result"])
通过合理的架构设计和参数调优,可以构建出既具备专业知识又保持通用能力的私有 GPT 助手。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online