ARTICLE · 1164520
模型背不住公司知识:用 RAG 把文档接到回答里
前两天写完「调 API」和「提示工程」,模型已经能按规则干活了。但客户的制度、合同、FAQ 它没见过。FDE 落地时,几乎都要把私有文档接进回答。这一块就叫 RAG:检索增强生成。
一、一本正经胡说八道

我确实遇到过模型一本正经胡说八道。更麻烦的是:我当时没立刻发现,是后来被别人指出的。
这说明一个问题:模型说得越自信,越容易骗过自己。网页聊天里还能靠人纠正;接到客户系统后,就必须让它「有据可查」。
二、RAG 四步

我一开始以为 RAG 就是一个文档数据库。理解对了一半。完整流程是四步:
切块:把制度、FAQ 切成小段 向量化:每段变成向量,存进向量库 检索:根据问题找出最相关的几段 生成:把这些段落塞进提示词,让模型据此回答
数据库负责找材料,模型负责组织答案。
三、制度 FAQ + 本地向量库

今天的练习继续用合同审查场景。我准备了三条虚构的公司制度 FAQ:
付款期限:采购合同默认付款期限为收到发票后 30 天内 违约金上限:违约金不超过合同总额的 10% 保密期限:保密义务在合同终止后继续有效 3 年
向量库我选本地的 Chroma,少依赖云服务,方便演示。
四、有检索 vs 无检索

测试题固定问:「我们公司采购合同的默认付款期限是多少天?」标准答案是 30。
有检索时,模型应该答 30,并引用 FAQ;关掉检索时,它更容易瞎编。这就是对照实验要证明的事。
五、答案必须带依据
我要求答案必须带依据,方便人工审核。法务愿意用的关键,往往不是「答得花」,而是「说得清出处」。
下面是最小 demo:
import osfrom openai import OpenAIimport chromadbfrom chromadb.utils import embedding_functionsclient = OpenAI(api_key=os.environ["OPENAI_API_KEY"])ef = embedding_functions.OpenAIEmbeddingFunction( api_key=os.environ["OPENAI_API_KEY"], model_name="text-embedding-3-small",)chroma = chromadb.Client()col = chroma.get_or_create_collection("faq", embedding_function=ef)FAQS = [ ("pay", "付款期限:采购合同默认付款期限为收到发票后 30 天内。"), ("penalty", "违约金上限:违约金不超过合同总额的 10%。"), ("secret", "保密期限:保密义务在合同终止后继续有效 3 年。"),]col.upsert(ids=[i[0] for i in FAQS], documents=[i[1] for i in FAQS])QUESTION = "我们公司采购合同的默认付款期限是多少天?"def ask(use_rag: bool) -> str: if use_rag: hits = col.query(query_texts=[QUESTION], n_results=2) context = "\n".join(hits["documents"][0]) system = ( "你是公司制度助手。只能根据给定文档回答。" "回答必须包含「依据:」并引用原文。找不到就说不知道。" ) user = f"文档:\n{context}\n\n问题:{QUESTION}" else: system = "你是公司制度助手。直接回答问题。" user = QUESTION r = client.chat.completions.create( model="gpt-4o-mini", temperature=0, messages=[{"role": "system", "content": system}, {"role": "user", "content": user}], timeout=30, ) return r.choices[0].message.content or ""if __name__ == "__main__": print("===== 有检索 =====") print(ask(True)) print("\n===== 无检索 =====") print(ask(False))依赖:pip install openai chromadb。跑完把两边输出贴进文章,对照是否答出 30、有没有写「依据」。
FDE 视角的结论:客户真正买的是「能引用自家文档的可靠回答」,不是又一个聊天框。
下一步:把 FAQ 换成真实制度,再加评测集,看检索命中率和引用正确率。
参考资料
[1] Contentful Python RAG 教程:https://www.contentful.com/blog/retrieval-augmented-generation-tutorial/
[2] OpenAI Retrieval 指南:https://developers.openai.com/api/docs/guides/retrieval
— 夏天软件AI —