ChatGLM + LangChain 本地知识库问答系统 实现原理与优化总结
ChatGLM + LangChain 是落地私有知识问答系统的绝佳组合,它不仅支持本地私有化部署,还提供了完整的文档解析、语义搜索、智能回答流程。如果你正好在做企业知识库、行业助手、客服系统等产品,这套方案值得直接复用!
·
文章目录
一、基础介绍
在 AI 大模型快速演进的背景下,越来越多企业开始关注「私有化知识问答系统」的落地实践。本篇将完整介绍如何结合 ChatGLM 和 LangChain 构建一个基于本地文档的问答系统,支持企业文档智能搜索与高质量回答生成。
技术选型简介
技术组件 | 选型工具 | 作用说明 | 推荐理由/备注 |
---|---|---|---|
大语言模型 | ChatGLM3 | 中文能力强、开源可本地部署,用于问答生成 | 支持中文上下文、精度好、私有部署友好 |
应用框架 | LangChain | 构建 RAG 问答系统的核心组件,支持文档加载、检索、提示词管理等 | 组件化强、生态成熟、与 ChatGLM 无缝集成 |
调用组件 | 选型接口/模型 | 作用说明 | 推荐理由/备注 |
---|---|---|---|
文档加载 | UnstructuredLoader 等 |
加载本地文档(PDF、Word、TXT、网页、Markdown 等) | 可自动识别结构,适配多种格式文档 |
文本切分 | RecursiveCharacterTextSplitter 等 |
将文档内容切分成块,便于向量化和上下文构建 | 支持中英文语义划分、窗口重叠设计,保证语义连贯 |
向量化模型 | text2vec-large-chinese 或 HuggingFace Embedding |
将文本转为向量,进行语义检索 | 中文支持好,可替换 OpenAI Embedding |
向量数据库 | FAISS | 存储和检索文本向量,进行相似度搜索 | 开源、轻量、查询快,适合中小型本地部署 |
Web 界面 | Gradio / Vue3 | 构建前端问答界面(输入问题、展示答案、引用来源) | 快速搭建 UI,适合原型与小规模项目 |
模型调用 | LangChain 的 LLM 模块 + 本地 ChatGLM3 |
统一处理 prompt 构建与模型推理调用 | 兼容 OpenAI/本地模型,可配置流式输出 |
Prompt 管理 | PromptTemplate / Chains | 管理提示词结构、构建问题 + 文档的组合输入 | 灵活支持多样化指令结构和上下文注入 |
OCR(图片转文本) | PaddleOCR | 对图片类文档进行文字提取,如截图、扫描件、图文混排文件等 | 精度高,中文支持强,可离线运行 |
表格解析 | PPStructure / LLM结构理解 | 对 PDF/Excel 等结构化数据进行字段提取、转换为 JSON,用于知识抽取场景 | 支持中文表格识别、结构保持较好 |
典型应用场景:文档问答、个人助理、表格查询、API调用、信息提取、文档总结等。
二、系统流程解析
基于本地知识库ChatGLM&LangChain实现原理流程图
流程节点解析
编号 | 节点名称 | 节点标识 | 功能说明 |
---|---|---|---|
1 | 本地文档 | A |
用户上传或接入的原始文档数据,如 PDF、TXT、DOC 等 |
2 | 非结构化加载器 | B |
使用 LangChain 中的 Loader 模块提取文档中的纯文本内容 |
3 | 原始文本 | C |
提取出来的整段原始文本,未经切分 |
4 | 文本切分器 | D |
将长文本按固定长度或语义段落进行切分,生成文本块(Chunk) |
5 | 文本块(切片) | E |
切分后的文本块,准备向量化 |
6 | 文本 Embedding | F |
将每个文本块转换为向量表示,用于语义检索(如通过 BGE、OpenAI Embedding) |
7 | 向量存储库 | G |
存储所有文档块对应的向量表示,可通过 FAISS、Chroma、Pinecone 等实现 |
8 | 用户查询 | H |
用户提出的问题或查询内容 |
9 | 查询 Embedding | I |
将用户查询也转化为向量形式,便于语义匹配 |
10 | 查询向量 | J |
用户查询的向量表示 |
11 | 向量相似度匹配 | K |
计算查询向量与向量库中各文档向量的相似度,选出最相关的文本块 |
12 | 匹配的文本块 | L |
与用户问题最相关的文档内容片段 |
13 | Prompt 模板构建器 | M |
将匹配文本和用户问题填入 Prompt 模板中 |
14 | Prompt 构造完成体 | N |
构建后的完整 Prompt(含上下文) |
15 | 大语言模型(LLM) | O |
调用 LLM(如 GPT-4、ChatGLM)进行生成回答 |
16 | 最终回答 | P |
LLM 基于 Prompt 生成的最终回复内容 |
三、本地知识库问答的核心流程
本地知识库问答的核心流程
整体实现遵循 RAG(Retrieval-Augmented Generation)架构,共分为文档入库、用户提问、向量匹配与生成回答四大流程。
3.1、文档处理与知识库构建
- 加载本地文档: 支持 PDF、TXT、Markdown、Docx、图片 OCR 等
- 文本切分: 基于中文标点(句号、问号、叹号)初步切分;
支持重叠窗口策略(如 chunk size=500,overlap=200)保持语义完整 :若超出 sentence_size(默认 100 字),则继续按逗号、分号等切分; 再将文档切分成片段用于向量化之前,为了避免上下文断裂和语义丢失,通常会采用“滑动窗口”的方式切分文本。chunk size=500 表示每个文本片段最大为 500 字符(或 token)overlap=200 表示相邻两个片段之间有 200 字符重叠部分。
效果:保留段落之间的语义联系;提高检索命中率;生成的回答上下文更连贯- Embedding 向量化: 默认使用text2vec-large-chinese 模型(是由 ModelScope(达摩院)发布的一款 中文语义向量模型,专为中文语义匹配与检索任务设计。)
- 将文本(如问题、文档段落)转化为 高维语义向量
- 与向量数据库配合,支持语义检索(如 Top-K 相似段落匹配)
- 向量存储(VectorStore)-FAISS + add_documents:使用 FAISS(或支持 Chroma、Milvus、Pinecone 等); 支持增量写入(如 add_documents:add_documents 是 LangChain 中 向量数据库(VectorStore)接口的一个方法,用于将新文档添加到已有的向量库中,实现知识库的增量更新,而无需重建整个索引)。
3.2、用户提问与语义检索
- 用户提问 → 进行同源 Embedding 向量化;
- 在向量库中执行 TopK 相似度检索;
- 可设定 score_threshold 过滤不相关内容(推荐 score < 500:语义搜索/相似度检索阶段 用来筛选相关文档片段的相似度阈值,意思是:只有当检索到的文档片段与用户问题的相似度分数超过这个阈值,才会被保留下来参与回答。);
- 举例:假设你问模型:“如何申请年假?”
检索系统会在知识库中找出一堆“可能相关”的文档片段,每一段都有一个相似度分数(score),比如:
文档段落内容 与提问的相似度分数(score)
“年假申请需登录 OA 系统…” 0.91 ✅(保留)
“公司加班审批流程如下…” 0.43 ❌(剔除)
“调休、事假和年假的区别如下…” 0.67 ✅(保留)
你设置了 score_threshold = 0.6,那就表示 分数低于 0.6 的内容将被忽略,不参与后续问答生成- 检索出的相关段落自动进行上下文扩充(如标题补正文);
- 支持对多段落进行排序与去重(防止语义重复)。
3.3、构建 Prompt 并调用语言模型
- 使用 Prompt Template (Prompt模板)构造最终输入:
已知信息:{context} 根据已知信息回答问题:{query}
- 传入 ChatGLM3模型调用生成回答;
- 支持单轮与多轮问答(通过 history 结构支持上下文对话)。
四、系统架构与目录结构
文件夹 | 功能 |
---|---|
models/ |
ChatGLM 本地模型封装(支持流式输出) |
loaders/ |
定义多种文件格式的文档加载器(含 OCR 支持) |
splitters/ |
文本切分器,优化中文切分策略 |
vectorstore/ |
本地向量库存储(默认 FAISS) |
chains/ |
定义不同类型的链式流程(支持图谱、表格等) |
configs/ |
全局参数设置(如 top_k、chunk_size、score_threshold) |
content/ |
上传的原始文档备份 |
web_ui/ |
Web 端界面(支持 Gradio / Vue) |
五、功能拓展与优化策略
- 文档处理优化
- 支持 OCR 图片转文字(PaddleOCR:是百度开源的中文 OCR 引擎,支持高精度识别 + 表格 + 版面检测):当知识库中有 扫描件、截图、发票、PPT图片 等图文资料时,可用 OCR 将文字提取出来,再加入向量库。;
- 支持结构化表格解析(PPStructure → JSON):结构化文档(如表格、报表、财务明细等)含有规整数据,不能简单按文字段落处理。PPStructure 是 PaddleOCR 中一个模块,用于识别 PDF、图片、表格中的字段关系,并输出结构化结果(如 JSON)。
– – 将 Excel/PDF 表格自动解析成字段对
– – 用于查询、信息提取、入库向量化- 可引入语义识别模型进行句群划分(阿里达摩院方案):普通文本切分按字符或标点可能导致 语义被割裂。句群划分指的是:按语义进行智能分段,比如:
段落 A:介绍问题背景
段落 B:给出解决方案
段落 C:备注和限制条件
阿里达摩院发布了中文文本层级结构识别模型(DocXChain开源,支持本地部署)(如 Doc结构预测、段落分类),可实现这种智能划分。
– – 提升 chunk 切分质量
– – 提高问答时的上下文完整性与准确性
示例:
将冗长的技术文档划分为:定义 → 步骤 → 注意事项- LLM 提升方式
- 支持微调 ChatGLM 和 Embedding 模型,适配垂类领域;
- 提供 Prompt Template 汉化与优化版本,提高中文语境匹配能力;
- 支持预设通用回答模板,控制模型“胡说八道”。
- 混合问答与智能调度
- 支持接入必应搜索、网页爬虫与 API 查询;
- 可配置 hybrid retrieval:知识库 + 搜索引擎:Hybrid Retrieval 是混合检索策略,即:
一部分答案来自 本地知识库(向量匹配)
一部分答案来自 实时搜索引擎(如 Bing、Google);
– – 补充知识库未覆盖的领域
– – 回答包含实时性/外部信息的问题(如:“2024 年个税政策”)
实现方式:
在 LangChain 中设置多种 Retriever,然后合并它们的输出做回答。- 未来可结合 Agent 实现工具自动调用、结构化解析等复杂任务。
比如 LangChain 中的 Agent 可以调用:
搜索引擎(搜索最新信息)
数据库(查询 SQL)
计算器(做加减乘除)
表格解析器(理解报表内容)
– – 实现自动化链式任务:读取发票 → 抽取字段 → 生成报销单
– – 结构化理解复杂内容:如分析合同 → 提取日期/条款
示例:
用户提问:“请告诉我 2023 销售额最高的省份,并解释原因。”
Agent 调用表格分析工具 + 检索工具 + LLM,自动回答。
六、常见问题与解决方案
问题 | 原因分析 | 解决方案 |
---|---|---|
回答无关或胡说八道 | 上下文无效或 prompt 模板设计不佳 | 调整 top_k / score_threshold,优化 Prompt |
长文档截断 | 超过 Token 限制 | 设置 trunk_size,优先排序关键段落 |
图片/表格无法解析 | OCR 或结构化模型缺失 | 引入 PaddleOCR / 表格解析工具 |
多文件知识库更新难 | 增量向量写入逻辑未实现 | 使用 FAISS +add_documents() 实现动态更新 |
问答不稳定 | 模型未适配中文或领域差异大 | 微调模型或使用语义摘要做匹配内容索引 |
七、后续发展方向
- 支持更多向量数据库(Chroma、Milvus 等);
LangChain 支持这些数据库作为 VectorStore 插件接口,只需更换配置即可切换使用。
向量库 特点 使用建议 FAISS 本地轻量、速度快 中小项目、本地部署场景 Chroma 零依赖、本地部署方便 快速原型开发 Milvus 分布式、可水平扩展、国产 企业级部署、海量文档 Qdrant 支持过滤器查询、多字段匹配 多标签文档管理场景
- 支持知识图谱结构的向量化(text-to-cypher + subgraph);
传统文档是线性文本,而知识图谱是一种“实体-关系-属性”三元组形式的结构化知识。
向量化的目标:
将图谱的节点、子图(subgraph)转为语义向量
支持用户问题与图谱内容的相似度匹配(如:查找某人相关的事件)
技术路径:
使用 LLM 执行 text-to-cypher(如将用户意图转为图查询语句)
或直接将图谱实体/路径编码为向量(如 Graph Embedding)
支持使用 Neo4j、ArangoDB + 向量插件(如 Neo4jVector)
示例:
用户问:“王小明在哪工作?” → 转为 MATCH (p:Person {name: “王小明”})-[:WORKS_AT]->(c:Company) RETURN c.name- 引入消息队列与模型调度,实现多用户并发;
在企业级部署中,多个用户同时提问或文档入库,可能导致请求阻塞或冲突。
解决方案是:
使用消息队列(如 RabbitMQ、Kafka、Redis Queue)将请求异步排队
使用模型调度器(如 Celery、Ray、FastAPI Task Pool)控制多个 LLM 实例的任务分发与负载均衡
作用:
实现问答并发处理
支持多 GPU 调度 / 后端模型池弹性伸缩
减少请求超时,提升系统稳定性
适用场景:
SaaS 多租户问答系统
部署多个 ChatGLM 模型处理大流量
大文件并行处理、向量入库等耗时任务解耦- 拓展 Agent 应用,辅助进行复杂任务(如数据问答、网页检索、数据库查询);
Agent 是具备“规划 + 工具调用”能力的智能体,能根据问题内容自动选择合适的操作路径。
可执行的任务包括:
调用搜索引擎查询实时数据
查询数据库(自然语言转 SQL)
调用图像解析器、表格抽取工具
执行文档分析、内容总结
LangChain 支持的 Agent 类型:
ReAct Agent:带思考 + 动作链式执行
Conversational Agent:可多轮指令交互
OpenAI Function Agent:接管外部函数
用途举例:
用户问:“给我查询一下 2023 年北京的社保缴纳比例,并总结成一段话”
Agent 自动调用爬虫 + LLM 总结 → 返回答案- 提供多种评分机制(Score)和召回率优化算法。
为了评估和优化 RAG 系统效果,需要设置打分机制来衡量:
回答是否相关(Relevance)
是否基于上下文生成(Faithfulness)
是否准确完整(Correctness)
可用机制:
通过 RAGAS 打分器自动评估问答对
手动评估(人工标注)或 GPT 判别器评测
设置 score_threshold 筛选检索质量
调整 TopK、重排序策略优化召回率
例子:
设置 TopK=3,Score 阈值=0.6,只保留相关性高的文段 → 降低幻觉、提升准确率
作用:
定量衡量系统性能
发现回答失败样本,指导 Prompt 优化
辅助微调和 Retriever 策略更新
更多推荐
所有评论(0)