在大模型应用中,如何让 AI 学习企业内部文档同时又不泄露核心隐私?检索增强生成(RAG) 是目前公认的最优解。本文将介绍一种极简且高效的架构:利用本地设备存储知识库,通过云端通义千问(Qwen) API 提供智能回答。
一、 系统架构:本地存储与云端大脑的协同
对于个人开发者或中小企业,自建 RAG 系统的核心痛点是 GPU 算力。本方案采用“轻量本地化 + 强大云端化”的组合:
| 模块 | 实现方案 | 部署位置 | 核心优势 |
|---|---|---|---|
| 向量库 (Vector Store) | Chroma | 本地磁盘 | 嵌入式数据库,免安装,数据不出本地 |
| 语义模型 (Embedding) | BGE-small-zh | 本地设备 | 在本地将文本转为向量,性能开销极小 |
| 推理引擎 (LLM) | 通义千问 (Qwen) API | 阿里云端 | 无需显卡,通过 API 获取顶尖逻辑能力 |
| 开发框架 | LangChain | 本地设备 | 标准化流水线,将各组件“缝合”成系统 |
二、 RAG 核心工作流程:从提问到回答
理解流程是调试系统的关键。当客户输入一个问题时,系统内部会经历以下链路:
- 用户提问:客户提交问题(例如:“公司去年的报销政策是什么?”)。
- 本地检索(核心环节) :
- 向量化:本地 Embedding 模型将问题转为数学向量。
- 比对:Chroma 在本地库中寻找语义最接近的文档片段。
- 召回:筛选出最相关的 3-5 条原始信息。
- 组装 (Augmentation) :LangChain 将检索到的“本地片段”作为背景资料,连同“原始问题”封装进一个 Prompt 模板。
- 云端推理:系统仅将拼接好的 Prompt 通过加密 API 发送给通义千问。
- 结果返回:Qwen 基于提供的参考资料生成回答,并传回本地界面。
三、 为什么选择本地 Chroma?
在本地设备(笔记本或办公 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 库,无需调整代码。