news 2026/2/28 13:12:28

GLM-4.7-Flash代码实例:向量数据库(Chroma)与RAG检索增强集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GLM-4.7-Flash代码实例:向量数据库(Chroma)与RAG检索增强集成

GLM-4.7-Flash代码实例:向量数据库(Chroma)与RAG检索增强集成

1. 为什么需要RAG?——让大模型“有据可查”

你有没有遇到过这种情况:问GLM-4.7-Flash一个专业领域的问题,它回答得头头是道,但翻查资料却发现关键数据或术语其实是错的?这不是模型“撒谎”,而是它在凭记忆作答——而记忆可能过时、模糊,甚至混杂了训练数据里的噪声。

RAG(Retrieval-Augmented Generation,检索增强生成)就是来解决这个问题的。它不靠模型硬记,而是像一位随时查阅资料库的专家:你提问时,它先快速从你自己的文档库里找出最相关的几段内容,再把这些“证据”连同问题一起交给GLM-4.7-Flash去理解、整合、生成答案。

这带来的变化很实在:

  • 答案更准确:不再凭空编造,所有结论都有原文支撑
  • 知识可更新:不用重新训练模型,只要更新你的文档库,答案就自动变新
  • 领域更专精:把公司产品手册、内部技术规范、客户合同等喂给它,它立刻变成你团队的“活百科”

本文不讲抽象概念,直接带你用50行以内可运行的Python代码,把GLM-4.7-Flash和轻量级向量数据库Chroma连起来,跑通一个真实可用的RAG流程——从准备文档、切片嵌入,到提问获取带引用的答案。全程无需GPU,笔记本就能跑通。

2. 环境准备:三步完成本地部署

别被“向量数据库”“嵌入模型”这些词吓住。我们用的是最轻量、最易上手的组合:Chroma(纯Python,无服务依赖)+ sentence-transformers(免费开源嵌入模型)+ GLM-4.7-Flash本地API(你已有的镜像)。整个过程就像搭积木,每一步都清晰可见。

2.1 安装必要依赖

打开终端,执行以下命令(已预装vLLM和Web界面的镜像中,只需补全RAG相关组件):

# 进入工作目录 cd /root/workspace # 安装Chroma和嵌入模型工具 pip install chromadb sentence-transformers python-dotenv # 验证GLM-4.7-Flash服务是否就绪(返回200即正常) curl -s http://127.0.0.1:8000/health | head -c 50

小提示:Chroma默认使用内存存储,适合快速验证。如需持久化保存文档库,只需加一行persist_directory="./chroma_db"即可,无需额外配置数据库服务。

2.2 准备你的第一份“知识源”

RAG的效果高度依赖输入文档的质量。我们用一份真实的AI开发文档片段作为示例——你可以随时替换成自己的PDF、Word或网页文本。

# 创建一个模拟的“技术文档”内容(实际使用时替换为你的文件) docs = [ "GLM-4.7-Flash采用MoE混合专家架构,总参数量30B,在中文任务上表现优异。", "该模型支持最大4096 tokens上下文长度,适合处理长篇技术文档摘要。", "vLLM推理引擎已深度优化,4卡RTX 4090 D下显存利用率达85%,响应延迟低于800ms。", "Web界面默认运行在7860端口,状态栏绿色表示模型已就绪,可立即对话。", "OpenAI兼容API地址为http://127.0.0.1:8000/v1/chat/completions,支持流式输出。" ]

这段代码里没有魔法,只是五句你镜像说明文档里的原话。RAG的强大之处正在于此:它不挑食,你给什么,它就学什么。

3. 构建你的专属知识库:从文档到向量

传统数据库存的是关键词,Chroma存的是“语义”。比如你搜索“模型多快”,它不会只找含“快”字的句子,而是理解“响应延迟低于800ms”和“推理速度快”是同一类信息。这个转换过程叫“嵌入(Embedding)”,我们用开源模型all-MiniLM-L6-v2——它小(89MB)、快、对中文友好。

3.1 文档切片与向量化

from langchain_community.vectorstores import Chroma from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_text_splitters import CharacterTextSplitter # 初始化嵌入模型(自动下载,首次运行稍慢) embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/all-MiniLM-L6-v2" ) # 将文档按标点切分成更小的语义块(避免单条过长影响检索精度) text_splitter = CharacterTextSplitter( separator=". ", # 按句号+空格切分 chunk_size=100, # 每块约100字符 chunk_overlap=20 # 相邻块重叠20字符,保证语义连贯 ) texts = text_splitter.create_documents(docs) # 构建Chroma向量库(数据存在内存,关机即清空) vectorstore = Chroma.from_documents( documents=texts, embedding=embeddings, collection_name="glm47_flash_docs" )

运行这段代码后,你的5句话就被拆成8个语义块,并各自转换成一串400维的数字向量——这就是Chroma能“读懂”它们的方式。整个过程在CPU上2秒内完成,无需GPU。

3.2 验证检索效果:看看它到底“懂”什么

别急着接大模型,先单独测试检索模块是否靠谱:

# 搜索“模型速度怎么样” results = vectorstore.similarity_search("模型速度怎么样", k=2) for i, doc in enumerate(results): print(f"匹配度#{i+1}: {doc.page_content}")

你会看到类似这样的输出:

匹配度#1: vLLM推理引擎已深度优化,4卡RTX 4090 D下显存利用率达85%,响应延迟低于800ms。 匹配度#2: GLM-4.7-Flash采用MoE混合专家架构,总参数量30B,在中文任务上表现优异。

注意:第二条没提“速度”,但因为“MoE架构”和“30B参数”常与高性能关联,Chroma依然把它列为次优结果——这正是语义检索的智能所在。

4. RAG流水线实战:三步串联,生成带依据的答案

现在,把检索(Retrieve)和生成(Generate)真正串起来。核心逻辑就三行:

  1. 用户提问 → 2. Chroma找出最相关的1-3个文档块 → 3. 把这些块+原始问题一起发给GLM-4.7-Flash生成答案

4.1 构建RAG提示模板

大模型需要明确指令才知道如何利用检索结果。我们设计一个简洁有效的提示词:

def build_rag_prompt(query: str, context_docs: list) -> str: context_str = "\n\n".join([f"参考信息{i+1}:{doc.page_content}" for i, doc in enumerate(context_docs)]) return f"""你是一个严谨的技术助手,所有回答必须严格基于提供的参考信息。 如果参考信息中未提及,明确回答“根据提供的资料无法确定”。 参考信息: {context_str} 用户问题:{query} 请用中文回答,答案控制在100字以内,不要添加额外解释。"""

这个模板的关键在于:

  • 强约束:“必须严格基于”“未提及则明确说明”,杜绝幻觉
  • 结构化输入:用“参考信息1/2/3”清晰分隔,避免模型混淆
  • 结果导向:限定字数,确保答案精炼,不拖泥带水

4.2 调用GLM-4.7-Flash API完成生成

import requests import json def rag_query(query: str): # 步骤1:检索相关文档 relevant_docs = vectorstore.similarity_search(query, k=2) # 步骤2:构建RAG提示 prompt = build_rag_prompt(query, relevant_docs) # 步骤3:调用本地GLM-4.7-Flash API response = requests.post( "http://127.0.0.1:8000/v1/chat/completions", json={ "model": "/root/.cache/huggingface/ZhipuAI/GLM-4.7-Flash", "messages": [{"role": "user", "content": prompt}], "temperature": 0.1, # 降低随机性,答案更稳定 "max_tokens": 256, "stream": False } ) # 解析返回结果 result = response.json() answer = result["choices"][0]["message"]["content"].strip() # 打印答案和所用依据(调试用) print(" 检索依据:") for i, doc in enumerate(relevant_docs): print(f" {i+1}. {doc.page_content[:50]}...") print(f"\n 最终答案:{answer}") return answer # 测试! rag_query("GLM-4.7-Flash的上下文长度是多少?")

运行后,你会得到类似这样的结果:

检索依据: 1. 该模型支持最大4096 tokens上下文长度,适合处理长篇技术文档摘要... 2. GLM-4.7-Flash采用MoE混合专家架构,总参数量30B... 最终答案:GLM-4.7-Flash支持最大4096 tokens上下文长度。

看,答案精准对应第一条依据,且没有添加任何额外信息——这才是RAG该有的样子。

5. 进阶技巧:让RAG更稳、更快、更准

上面的代码已能工作,但真实场景中还需几处关键优化。这些不是“炫技”,而是工程落地的必备经验。

5.1 处理长文档:PDF/Word一键导入

你不可能手动复制粘贴上百页PDF。用pymupdf(fitz)和python-docx,两行代码搞定:

# 读取PDF(需先pip install PyMuPDF) import fitz doc = fitz.open("your_manual.pdf") pdf_text = "" for page in doc: pdf_text += page.get_text() # 读取Word(需先pip install python-docx) from docx import Document doc = Document("your_spec.docx") word_text = "\n".join([p.text for p in doc.paragraphs])

然后把pdf_textword_text传给前面的text_splitter.create_documents()即可。实测一份50页PDF,切片+嵌入全程不到20秒。

5.2 提升检索精度:关键词+语义双路召回

纯语义检索有时会漏掉精确匹配。加入关键词过滤,效果立竿见影:

# 在similarity_search后,增加关键词粗筛 def hybrid_search(query: str, k=3): # 先用语义检索初选 candidates = vectorstore.similarity_search(query, k=k*2) # 再用关键词筛选(简单版:检查是否含query中的核心词) core_words = [w for w in query.split() if len(w) > 2] filtered = [doc for doc in candidates if any(word in doc.page_content for word in core_words)] return filtered[:k] or candidates[:k] # 退回到纯语义结果

5.3 防止“一本正经胡说”:答案溯源与置信度

用户有权知道答案来自哪。我们在最终输出中自动标注依据编号:

# 修改build_rag_prompt,让模型在答案末尾注明依据 return f"""...(同上)... 请用中文回答,答案控制在100字以内。若答案来自参考信息1,请在句末加[1];来自参考信息2,加[2];若综合两者,加[1][2]。""" # 示例输出:GLM-4.7-Flash支持最大4096 tokens上下文长度。[1]

这不仅是透明化,更是责任追溯——当答案出错时,你能立刻定位到是文档本身有误,还是检索环节出了偏差。

6. 总结:RAG不是功能,而是工作方式的升级

回顾整个过程,你其实只做了三件事:准备文档、切片入库、写几行胶水代码。但带来的改变是质的:

  • 对开发者:不再需要微调大模型,用现有镜像+自己数据,30分钟上线一个垂直领域问答机器人
  • 对业务方:知识更新零成本,销售手册改版后,客服机器人答案自动同步,无需等待AI团队排期
  • 对模型本身:GLM-4.7-Flash从“全能但偶尔出错的学霸”,变成了“专注且言之有据的专家”

RAG的价值,从来不在技术多炫酷,而在于它把大模型从“黑盒生成器”变成了“可验证、可审计、可迭代”的生产力工具。你今天跑通的这50行代码,就是撬动这个转变的第一根杠杆。

下一步,你可以尝试:

  • 把Chroma的persist_directory指向一个固定路径,让知识库永久保存
  • 用Gradio快速封装一个Web界面,让非技术人员也能提问
  • 将API接入企业微信/钉钉,让RAG成为团队日常协作的一部分

真正的智能,不在于模型多大,而在于它能否无缝融入你的工作流——而这一切,已经开始了。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 4:04:47

LLaVA-v1.6-7B实战部署:Kubernetes集群中Ollama多实例调度方案

LLaVA-v1.6-7B实战部署:Kubernetes集群中Ollama多实例调度方案 在多模态AI应用快速落地的今天,如何让视觉语言模型既保持高性能又具备生产级稳定性,成了很多技术团队的实际挑战。LLaVA-v1.6-7B作为当前轻量级多模态模型中的佼佼者&#xff0…

作者头像 李华
网站建设 2026/2/25 9:47:13

AI手势识别在智能设备中的应用:低成本部署案例

AI手势识别在智能设备中的应用:低成本部署案例 1. 为什么手势识别正在走进 everyday 设备 你有没有想过,家里的智能音箱、工厂的工业平板、学校的电子白板,甚至一台老款笔记本电脑,其实都能“看懂”你的手势?不是靠昂…

作者头像 李华
网站建设 2026/2/27 12:15:08

WeKnora参数详解:streaming响应模式对Web界面用户体验的影响

WeKnora参数详解:streaming响应模式对Web界面用户体验的影响 1. WeKnora是什么:一个专注“所问即所得”的知识库问答系统 WeKnora不是另一个泛泛而谈的聊天机器人,它是一个为“精准信息提取”而生的轻量级知识库问答系统。它的设计哲学非常…

作者头像 李华
网站建设 2026/2/28 1:56:19

Qwen3-1.7B适合哪些业务?三个落地场景推荐

Qwen3-1.7B适合哪些业务?三个落地场景推荐 Qwen3-1.7B不是“小而弱”的妥协,而是“小而精”的务实选择。当企业面对成本、延迟、部署灵活性与实际业务需求之间的平衡难题时,这个仅1.7B参数的模型反而展现出惊人的适配性——它不追求在通用榜…

作者头像 李华
网站建设 2026/2/23 4:59:11

告别复杂配置,人像卡通化开箱即用体验

告别复杂配置,人像卡通化开箱即用体验 你是否试过为一张照片调出理想卡通效果,却卡在环境安装、依赖冲突、CUDA版本不匹配的死循环里?是否下载了十几个GitHub项目,最后发现README里写着“需自行编译ONNX Runtime”“GPU显存≥12G…

作者头像 李华