
本篇是「AI Agent 实战经验」系列的深度教程。读完你能照着搭出一条可落地的企业私域文档问答链路,并清楚它和托管型知识工具(如 IMA)各自的边界。
企业里真正值钱的知识,大多锁在制度文件、合同范本、产品手册、客服 FAQ 这些私域文档里。把它们直接丢给通用大模型,要么答不准、要么一本正经地编(幻觉),更麻烦的是敏感内容不能随便出域。我带团队做内部问答时,核心诉求就一句:让模型先查私有资料、再开口回答。RAG 就是为此而生的范式。
RAG(Retrieval-Augmented Generation,检索增强生成)由 Lewis 等人于 2020 年提出(论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》)。它的思路很朴素:用户提问时,先从一个可信知识库里检索出最相关的几段原文,再把原文和问题一起交给大模型,让它"基于这些材料作答"。
企业私域知识库 = 把内部文档预处理成"可语义检索的向量库"。问答时模型只在你提供的资料里找依据,回答可溯源、幻觉可控、数据不出域。注意它和托管型知识工具(IMA 这类开箱即用的 SaaS 工作台)是互补关系,不是替代——区别放在第六节 FAQ 详聊。
链路分两半:
典型数据流:原始 PDF/Word/TXT → Document Loaders → Text Splitter → Embedding Model → Vector Store(如 Chroma)→ Retriever → LLM → 带引用的答案。
![架构图:离线建库与在线问答两阶段流水线]
下面是一段示意示例,API 均为 LangChain 官方文档中的真实接口(RecursiveCharacterTextSplitter、HuggingFaceEmbeddings、Chroma.from_documents、as_retriever、create_retrieval_chain)。落地时请安装 langchain-community、chromadb、sentence-transformers,并把 LLM 换成你本地或云端兼容 OpenAI 协议的端点;本示例不含任何真实密钥。
# pip install langchain-community chromadb sentence-transformers
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
# 1) 加载私域文档(带部门/密级等 metadata,用于权限隔离)
loader = DirectoryLoader("./docs", glob="**/*.txt", loader_cls=TextLoader)
raw_docs = loader.load()
# 2) 递归切分:保留语义完整,重叠避免截断
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=80)
chunks = splitter.split_documents(raw_docs)
# 3) 本地嵌入模型,文本不出域(也可换云端 embedding API)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# 4) 建库并持久化
vector_store = Chroma.from_documents(
chunks, embeddings, persist_directory="./chroma_private"
)
# 5) 检索 + 生成(k=3 取最相关片段;where 做行级权限过滤)
retriever = vector_store.as_retriever(
search_kwargs={"k": 3, "where": {"department": "finance"}}
)
prompt = ChatPromptTemplate.from_messages([
("system", "只依据下面上下文回答,不知道就说不知道。\nContext: {context}"),
("human", "{input}"),
])
llm = ChatOpenAI(model="your-local-model", temperature=0, base_url="http://localhost:8000/v1")
chain = create_retrieval_chain(retriever, create_stuff_documents_chain(llm, prompt))
print(chain.invoke({"input": "差旅报销的审批额度是多少?"})["answer"])要点:where={"department":"finance"} 这一行是企业权限隔离的关键——不同角色只检索到被授权的文档片段,而不是全库裸奔。
chunk_size 按文档类型调,256–512 token 是安全区间,512 为常用起点,具体需依文档类型与切分边界调整;chunk_overlap 留 10%–20% 防截断。sentence-transformers(维度常见 384/768),求效果可用云端 embedding API(如 1536 维)。距离度量多用余弦相似度,检索靠 HNSW/IVF 等近似最近邻算法。向量库 | 定位 | 适合规模 | 亮点 | 注意 |
|---|---|---|---|---|
Chroma | 本地/原型 | 百万级以内 | 零配置、HNSW、带 metadata | 大规模运维弱 |
pgvector | 挂 PostgreSQL | 数百万 | SQL 原生、已有 PG 零迁移 | 超大规模下扩展性弱于专用引擎 |
Qdrant | Rust 高性能 | 数亿级 | 过滤快、可落盘 | 生态较小 |
Weaviate | 混合检索 | 中大规模 | BM25+向量原生 | 内存占用高 |
Milvus | 分布式 | 百亿级(集群可达万亿级) | GPU 加速、云原生 | 运维复杂 |
Pinecone | 全托管 SaaS | 弹性 | 零运维 | 闭源、成本高、国内无节点 |
我不编数字——RAG 的效果必须用你自己的业务指标量。落地时建议盯三条:
我的经验是:把几百份制度/手册建成可检索库后,最常见的提升是"新员工自助问答替代了大量重复咨询",但量化收益取决于你原本的痛点基线,请用自己的前后对比说话,别套行业均值。
where 过滤做行级隔离;敏感数据用本地 embedding 不出域;国内业务优先选有国内节点的云厂商向量库,规避数据出境风险。延伸:这条检索能力可以封装成一个 Tool/技能,挂给 Agent 调用(通过 Function Calling 或 MCP 协议),让 Agent 在回答前先查你的私域资料——这也是 RAG 与 Agent 工程化结合的常见落点。
Q1:RAG 和直接微调模型比,怎么选?微调改的是模型"脑子里"的参数,适合固定风格/任务;RAG 改的是"手边的资料",知识可随时更新、可溯源。企业私域知识频繁变动时,RAG 通常更划算、更可控。
Q2:私域数据隐私怎么保证?三条:① 用本地嵌入模型,文本不出机;② 向量库与生成服务部署在自有环境;③ 用 metadata 过滤做角色级权限隔离。敏感等级高的文档,别走任何公有 embedding API。
Q3:RAG 私域知识库和 IMA 这类托管工具(内容 31)有什么区别?一句话——IMA 是"开箱即用的托管知识工作空间",RAG 私域是"你自己掌控的检索架构"。IMA(ima.copilot)帮你和团队快速沉淀、调用知识,不用搭基建,适合个人/团队日常;而自建 RAG 私域库,数据主权完全在你手里,能嵌入自有业务系统、支持私有化与本地 embedding,检索逻辑自己定。两者互补:日常知识沉淀用 IMA,要把私有知识塞进业务系统或对数据主权有强要求时,自建 RAG。
Q4:小团队从哪起步?先用 Chroma 本地 Docker 把几十份文档跑通一条最小链路(本篇代码改改即可),验证问答质量;再按规模迁移到 pgvector 或 Milvus,逐步补 metadata、混合检索和权限。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。