开发者实战:基于本地 Chroma 与云端通义千问搭建 RAG 系统

0 阅读3分钟

在大模型应用中,如何让 AI 学习企业内部文档同时又不泄露核心隐私?检索增强生成(RAG) 是目前公认的最优解。本文将介绍一种极简且高效的架构:利用本地设备存储知识库,通过云端通义千问(Qwen) API 提供智能回答。


一、 系统架构:本地存储与云端大脑的协同

image-20260307225543003

对于个人开发者或中小企业,自建 RAG 系统的核心痛点是 GPU 算力。本方案采用“轻量本地化 + 强大云端化”的组合:

模块实现方案部署位置核心优势
向量库 (Vector Store)Chroma本地磁盘嵌入式数据库,免安装,数据不出本地
语义模型 (Embedding)BGE-small-zh本地设备在本地将文本转为向量,性能开销极小
推理引擎 (LLM)通义千问 (Qwen) API阿里云端无需显卡,通过 API 获取顶尖逻辑能力
开发框架LangChain本地设备标准化流水线,将各组件“缝合”成系统

二、 RAG 核心工作流程:从提问到回答

image-20260307225606123

理解流程是调试系统的关键。当客户输入一个问题时,系统内部会经历以下链路:

  1. 用户提问:客户提交问题(例如:“公司去年的报销政策是什么?”)。
  2. 本地检索(核心环节)
  • 向量化:本地 Embedding 模型将问题转为数学向量。
  • 比对Chroma 在本地库中寻找语义最接近的文档片段。
  • 召回:筛选出最相关的 3-5 条原始信息。
  1. 组装 (Augmentation) :LangChain 将检索到的“本地片段”作为背景资料,连同“原始问题”封装进一个 Prompt 模板。
  2. 云端推理:系统仅将拼接好的 Prompt 通过加密 API 发送给通义千问。
  3. 结果返回:Qwen 基于提供的参考资料生成回答,并传回本地界面。

三、 为什么选择本地 Chroma?

image-20260307225717431

在本地设备(笔记本或办公 PC)运行项目时,Chroma 是开发者的首选:

  • 零运维:像 SQLite 一样,数据直接存为本地文件,无需 Docker 或服务器环境。
  • 隐私保护:所有的私有文档切片和索引都保存在本地磁盘,云端大模型只在回答瞬间看到精选后的片段。
  • 极速检索:针对万级数据量,本地检索延迟几乎可以忽略不计。

四、 代码实现:半天即可交付的 RAG 闭环

1. 环境准备

pip install langchain-community dashscope chromadb sentence-transformers
​

2. 核心集成代码

import os
from langchain_community.llms import Tongyi
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
​
# 1. 配置云端 API Key
os.environ["DASHSCOPE_API_KEY"] = "你的_API_KEY"
​
# 2. 本地文档加载与切片 (Chunking)
loader = DirectoryLoader('./my_docs', glob="**/*.txt") # 读取本地 my_docs 文件夹
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=600, chunk_overlap=100)
chunks = text_splitter.split_documents(documents)
​
# 3. 初始化本地 Embedding 模型 (BGE 架构对中文理解力极强)
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
​
# 4. 初始化本地 Chroma 向量库 (数据持久化在 local_db 文件夹)
vector_db = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./local_db"
)
​
# 5. 连接云端【通义千问】API
llm = Tongyi(model_name="qwen-turbo", temperature=0.1)
​
# 6. 构建并运行 RAG 流程链
rag_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff", # 简单填充模式
    retriever=vector_db.as_retriever(search_kwargs={"k": 3})
)
​
# 7. 问答测试
print(rag_chain.invoke({"query": "文档里提到的核心技术指标有哪些?"})["result"])
​

五、 总结与建议

对于客户自建 RAG 系统,本方案实现了性能与成本的平衡

  • 低成本:无需购买昂贵的 H100/A100 显卡,普通办公电脑即可运行。
  • 高质量:借助通义千问云端强大的参数量,回答的逻辑性远超本地运行的小模型。
  • 可扩展:随着文档增加,只需更新本地 Chroma 库,无需调整代码。