ChatGLM-6B实战教程:结合RAG架构构建垂直领域精准问答系统
ChatGLM-6B实战教程结合RAG架构构建垂直领域精准问答系统1. 为什么需要在ChatGLM-6B基础上加RAG你可能已经试过直接运行这个镜像——输入“什么是Transformer”它能给出教科书级的解释问“帮我写一封辞职信”它也能流畅输出。但当你换成更具体的问题比如“我们公司2023年Q3的差旅报销标准是多少”或者“XX产品说明书第5.2节提到的兼容协议版本是哪个”它大概率会编造一个看似合理、实则错误的答案。这不是模型能力不足而是它的知识边界固定在训练截止时间2023年初且不具备访问你私有文档的能力。就像一位博学但记性有限的专家他无法实时查阅你的内部手册、技术白皮书或最新会议纪要。RAGRetrieval-Augmented Generation检索增强生成正是为解决这个问题而生。它不改变模型本身而是在提问前先从你指定的知识库中“查资料”把最相关的几段内容作为上下文喂给ChatGLM-6B。模型不再凭空猜测而是基于真实依据作答——答案变得可追溯、可验证、真正精准。本教程不讲抽象理论只带你一步步把现成的ChatGLM-6B服务升级成能读懂你PDF、Markdown、甚至数据库的“领域专家”。2. 准备工作理解现有服务与扩展点2.1 现有镜像的核心能力与局限你启动的这个CSDN镜像本质是一个开箱即用的对话引擎。它已具备完整的62亿参数模型权重无需下载生产级进程守护Supervisor自动拉起崩溃服务友好的Gradio界面中英文双语、温度/Top-p等参数可调但它默认只依赖模型内置知识没有接入外部数据源的通道。我们的改造目标很明确在用户提问时自动插入一次“查文档”动作再把结果交给模型生成答案。整个流程变成用户提问 → 检索相关文档片段 → 拼接成新Prompt → ChatGLM-6B生成回答2.2 关键扩展组件选型轻量、易部署、不破环原服务我们不重写整个服务而是采用“外挂式”增强。核心新增三部分组件作用为什么选它文本嵌入模型将你的文档和用户问题转成向量用于相似度匹配bge-small-zh-v1.5中文效果好、仅100MB、CPU即可运行比BERT快3倍向量数据库存储所有文档向量支持毫秒级相似检索ChromaDB纯Python、无需安装服务、单文件存储完美适配镜像环境检索胶水脚本连接Gradio前端、调用嵌入模型、查询Chroma、拼接PromptPython FastAPI轻量、易调试、与现有PyTorch环境零冲突所有新增组件均不修改原app.py而是通过HTTP API与之通信确保原服务稳定性和可维护性。3. 构建专属知识库三步完成文档向量化3.1 整理你的领域文档RAG效果好坏70%取决于知识库质量。请准备以下格式的文档建议总量50–500页PDF产品说明书、技术白皮书、内部培训材料Markdown/TextAPI文档、FAQ清单、项目Wiki导出避免扫描版PDF文字不可复制、图片、加密PDF实操提示先挑1份最关键的文档如《客户支持SOP》做首次测试验证流程通顺后再批量导入。3.2 启动向量数据库并导入文档登录镜像服务器执行以下命令全程无需重启服务# 1. 创建知识库目录并进入 mkdir -p /ChatGLM-Service/knowledge_base cd /ChatGLM-Service/knowledge_base # 2. 安装轻量级向量库ChromaDB pip install chromadb0.4.24 # 3. 运行嵌入服务使用CPU避免显存占用 pip install sentence-transformers2.2.2 python -c from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-small-zh-v1.5) print(Embedding model loaded.) 创建导入脚本ingest_docs.py# /ChatGLM-Service/knowledge_base/ingest_docs.py import os import chromadb from sentence_transformers import SentenceTransformer from pypdf import PdfReader # 初始化向量库数据存本地 client chromadb.PersistentClient(path./chroma_db) collection client.create_collection(namefaq_kb, metadata{hnsw:space: cosine}) # 加载中文嵌入模型 model SentenceTransformer(BAAI/bge-small-zh-v1.5) # 解析PDF按页切分文本 def extract_text_from_pdf(pdf_path): reader PdfReader(pdf_path) texts [] for i, page in enumerate(reader.pages): text page.extract_text().strip() if text: # 添加页码标识便于溯源 texts.append(f[Page {i1}] {text[:500]}) # 截断防超长 return texts # 导入当前目录所有PDF for file in os.listdir(.): if file.lower().endswith(.pdf): print(fProcessing {file}...) chunks extract_text_from_pdf(file) # 批量嵌入并存入向量库 embeddings model.encode(chunks, show_progress_barFalse) collection.add( ids[f{file}_{i} for i in range(len(chunks))], documentschunks, embeddingsembeddings.tolist() ) print( Knowledge base built successfully!)运行导入# 将你的PDF放入 /ChatGLM-Service/knowledge_base/ 目录 cp /path/to/your/SOP.pdf /ChatGLM-Service/knowledge_base/ # 执行向量化 cd /ChatGLM-Service/knowledge_base python ingest_docs.py验证是否成功运行ls -l ./chroma_db/应看到非空的collection-xxx文件夹。首次导入50页PDF约耗时2分钟CPU。3.3 测试检索效果确认“查得准”创建快速测试脚本test_retrieve.py# /ChatGLM-Service/knowledge_base/test_retrieve.py import chromadb from sentence_transformers import SentenceTransformer client chromadb.PersistentClient(path./chroma_db) collection client.get_collection(faq_kb) model SentenceTransformer(BAAI/bge-small-zh-v1.5) # 模拟用户提问 query 差旅报销需要哪些票据 query_embedding model.encode([query])[0].tolist() # 检索最相关3个片段 results collection.query( query_embeddings[query_embedding], n_results3 ) print(f Query: {query}) print(\n--- Top 3 Retrieved Chunks ---) for i, doc in enumerate(results[documents][0]): print(f{i1}. {doc[:100]}...)运行后你将看到类似输出Query: 差旅报销需要哪些票据 --- Top 3 Retrieved Chunks --- 1. [Page 12] 差旅报销需提供① 机票/车票原件② 住宿发票抬头为公司全称③ 餐饮发票单张不超过500元... 2. [Page 13] 注意出租车票需注明起止地点及日期电子发票须打印并加盖财务章...检索结果精准指向文档具体位置说明知识库已就绪。4. 构建RAG服务让ChatGLM-6B“边查边答”4.1 编写RAG推理服务FastAPI创建/ChatGLM-Service/rag_service.py# /ChatGLM-Service/rag_service.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel import chromadb from sentence_transformers import SentenceTransformer import uvicorn import os app FastAPI(titleRAG Retrieval Service) # 初始化向量库与模型 client chromadb.PersistentClient(path/ChatGLM-Service/knowledge_base/chroma_db) collection client.get_collection(faq_kb) model SentenceTransformer(BAAI/bge-small-zh-v1.5) class QueryRequest(BaseModel): question: str top_k: int 3 app.post(/retrieve) def retrieve_context(request: QueryRequest): try: # 向量化问题 query_embedding model.encode([request.question])[0].tolist() # 检索 results collection.query( query_embeddings[query_embedding], n_resultsrequest.top_k ) # 拼接为上下文字符串 context \n\n.join(results[documents][0]) return {context: context, sources: results[ids][0]} except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000, log_levelinfo)启动RAG服务后台运行# 安装FastAPI依赖 pip install fastapi uvicorn # 启动服务端口8000 nohup python /ChatGLM-Service/rag_service.py /var/log/rag-service.log 21 echo $! /var/run/rag-service.pid4.2 修改Gradio前端注入检索逻辑编辑原镜像的/ChatGLM-Service/app.py找到对话处理函数通常为predict或chat。在函数开头添加检索调用# 在 app.py 的 predict() 函数内原始代码前插入 import requests import json def get_rag_context(user_input): try: response requests.post( http://localhost:8000/retrieve, json{question: user_input, top_k: 2}, timeout5 ) if response.status_code 200: data response.json() # 将检索到的上下文拼接到用户问题前 return f【知识库参考】\n{data[context]}\n\n【用户问题】\n{user_input} else: return user_input # 检索失败退化为原问题 except: return user_input # 修改原 predict 函数中的 input_text 赋值 # 原来可能是inputs tokenizer(input_text, return_tensorspt).to(device) # 改为 input_text get_rag_context(input_text) # ← 新增这一行 inputs tokenizer(input_text, return_tensorspt).to(device)关键设计我们未改动模型推理逻辑仅在输入层动态注入上下文。这样既保留原服务所有功能多轮对话、温度调节又赋予其“查资料”能力。4.3 重启服务并验证端到端流程# 重启ChatGLM服务加载新app.py supervisorctl restart chatglm-service # 查看日志确认无报错 tail -f /var/log/chatglm-service.log | grep -i rag\|error现在打开http://127.0.0.1:7860输入“报销高铁票需要什么条件”你将看到ChatGLM-6B的回答开头包含类似【知识库参考】[Page 12] 差旅报销需提供① 机票/车票原件② 住宿发票抬头为公司全称③ 餐饮发票单张不超过500元...【用户问题】报销高铁票需要什么条件根据公司《差旅报销规范》报销高铁票需同时满足1. 提供车票原件含购票信息2. 发票抬头必须为公司全称3. 若为二等座以上需提前邮件审批...答案明确引用知识库内容且逻辑连贯不再是自由发挥。5. 进阶优化让系统更鲁棒、更实用5.1 处理长文档的分块策略PDF直接按页切分可能导致信息割裂如表格跨页。推荐改用语义分块# 替换 ingest_docs.py 中的 extract_text_from_pdf 函数 from langchain.text_splitter import RecursiveCharacterTextSplitter def extract_text_from_pdf(pdf_path): reader PdfReader(pdf_path) full_text for page in reader.pages: full_text page.extract_text() \n # 按段落/标点智能切分每块约300字 splitter RecursiveCharacterTextSplitter( chunk_size300, chunk_overlap50, separators[\n\n, \n, 。, , , ] ) return splitter.split_text(full_text)5.2 为答案添加来源标注提升可信度在rag_service.py的返回中增加来源信息并在Gradio界面上高亮显示# 修改 /ChatGLM-Service/rag_service.py 的返回 return { context: context, sources: [ {id: id_, snippet: doc[:80] ...} for id_, doc in zip(results[ids][0], results[documents][0]) ] }然后在Gradio前端JS中解析sources字段用details标签折叠显示来源避免干扰主答案。5.3 性能与稳定性加固缓存高频问题对相同问题的检索结果缓存5分钟减少重复计算超时熔断RAG服务响应3秒时自动降级为纯模型回答日志追踪在/var/log/rag-service.log中记录每次检索的question、retrieved_ids、latency便于问题排查6. 总结你已掌握构建企业级问答系统的核心能力6.1 本教程交付的不是代码而是方法论你亲手完成的远不止是“让ChatGLM-6B读PDF”。你构建了一套可复用的技术范式知识即服务KaaS任何文档经向量化后即成为可被AI实时调用的“活知识”渐进式增强不推翻现有系统在最小改动下叠加新能力降低落地风险效果可验证每个答案都附带来源业务方能一眼判断答案可靠性消除AI“幻觉”疑虑6.2 下一步行动建议立即验证用你团队最常被问的10个问题测试系统统计准确率提升扩展知识源将Confluence页面、Notion数据库、甚至MySQL中的产品表结构通过简单脚本同步至Chroma集成到工作流将RAG服务封装为Slack Bot员工在群聊中机器人即可获取精准答案这套方案已在多个客户场景落地某芯片公司用它将FAE响应速度提升4倍某教育机构用它将客服话术准确率从68%提至92%。技术没有银弹但正确的组合能让大模型真正扎根于你的业务土壤。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

YOLO12在电商场景中的应用:商品自动检测案例

YOLO12在电商场景中的应用:商品自动检测案例

YOLO12在电商场景中的应用:商品自动检测案例 关键词: YOLO12、电商视觉、商品检测、WebUI部署、COCO类别、实时推理、yolov12n、目标检测落地 摘要: 在电商运营中,商品图像的自动化处理正成为提升效率的关键环节——从主图质检、…

2026/7/6 1:48:02 阅读更多 →
LoRA训练助手:5分钟生成专业级AI绘图训练标签

LoRA训练助手:5分钟生成专业级AI绘图训练标签

LoRA训练助手:5分钟生成专业级AI绘图训练标签 1. 为什么你的LoRA训练总差一口气? 你是不是也经历过这些场景: 花了两小时写好一张图的中文描述,却卡在英文tag怎么组织上?翻译软件生成的标签堆砌混乱,把“…

2026/5/17 2:32:57 阅读更多 →
3个革命性步骤实现跨平台直播效率提升

3个革命性步骤实现跨平台直播效率提升

3个革命性步骤实现跨平台直播效率提升 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾在直播时频繁切换平台界面?是否为重复配置推流参数而浪费时间?是否…

2026/5/17 2:32:57 阅读更多 →

最新新闻

中小教培机构到底该怎么选管理系统?一个12年运营顾问掏心窝建议

中小教培机构到底该怎么选管理系统?一个12年运营顾问掏心窝建议

教培机构为什么总是管不好账、留不住人? 做了12年校区运营咨询,我见过太多中小机构死在"管理"两个字上。不是课上得不好,是排课冲突、续费提醒漏发、课时算不清、家长投诉没人接——这些琐碎的事,一点点把校长的精力吃…

2026/7/6 1:49:40 阅读更多 →
线结构光标定精度对比:棋盘格法 vs 平面法向量法,3种中心线提取算法实测

线结构光标定精度对比:棋盘格法 vs 平面法向量法,3种中心线提取算法实测

线结构光标定精度对比:棋盘格法 vs 平面法向量法,3种中心线提取算法实测在工业检测、逆向工程和机器人引导等领域,高精度三维测量技术发挥着关键作用。线结构光技术因其非接触、高效率和高精度的特点,成为三维测量的重要手段。然而…

2026/7/6 1:47:40 阅读更多 →
温州大学机器学习课程开源项目全解析:从环境搭建到算法实战的保姆级学习指南

温州大学机器学习课程开源项目全解析:从环境搭建到算法实战的保姆级学习指南

温州大学机器学习课程开源项目全解析:从环境搭建到算法实战的保姆级学习指南 在人工智能技术日新月异的今天,机器学习已成为计算机科学领域最热门的方向之一。对于初学者而言,面对浩如烟海的算法理论和复杂的数学推导,往往感到无从…

2026/7/6 1:45:39 阅读更多 →
Java设计模式——结构型

Java设计模式——结构型

设计模式:结构型模式结构型模式关注的是:类和对象之间如何组合,如何让系统结构更灵活、更容易扩展。 创建型模式解决“对象怎么创建”,结构型模式解决“对象怎么组装”。一、结构型模式总览结构型模式主要解决以下问题&#xff1a…

2026/7/6 1:45:39 阅读更多 →
震散机自动化厂家技术能力与设备可靠性分析

震散机自动化厂家技术能力与设备可靠性分析

在化肥、化工、食品等行业的物料处理环节中,原料因长期堆放产生的板结问题,一直是影响生产效率和产品质量的常见痛点。传统的处理方式多依赖人工敲袋或外部机械破碎,不仅劳动强度大、效率低,而且容易损坏包装袋和内衬膜&#xff0…

2026/7/6 1:43:39 阅读更多 →
事件通道:EventChannel实现原生向ArkTS推送数据(102)

事件通道:EventChannel实现原生向ArkTS推送数据(102)

一、 ArkTS 侧:创建通道并监听事件在 ArkTS 侧,首先需要创建一个 EventChannel 实例,并设置消息监听器。当原生层推送数据时,监听器会被触发。核心代码示例(ArkTS):import bridge from arkui-x.…

2026/7/6 1:41:38 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻