☰
AI Agent 中 RAG 的三层知识获取管道设计
2026/11/4 9:29:59 网站建设 项目流程

1. 这不是“加个知识库”那么简单:RAG 在 AI Agent 架构里到底承担什么角色?

你翻过不少 AI Agent 教程,大概率见过这样的流程图:用户输入 → LLM 理解 → 工具调用 → 返回结果。看起来很干净,对吧?但只要真动手做过一个能落地的 Agent,比如让 Agent 帮销售查公司最新财报、帮法务检索合同条款效力判例、帮工程师查内部 API 文档变更记录——你马上会发现,LLM 的“原生知识”根本不够用。它不知道你们公司上个月刚上线的 CRM 系统字段命名规则,不记得去年修订的《数据安全管理办法》第十七条新增了什么审批节点,更没法回答“张工上周在 Jira 提的关于 Redis 缓存穿透的修复方案具体怎么实现的”。这时候,有人会说:“加个知识库不就完了?”——错。这不是加个知识库,而是重建整个信息流动的血管系统。

RAG(Retrieval-Augmented Generation)在 AI Agent 里,从来不是可有可无的插件,它是知识获取管道(Knowledge Acquisition Pipeline)的主干道。它解决的不是“有没有知识”,而是“在正确的时间、以正确的形式、把正确的知识片段,精准输送到 LLM 的上下文窗口里”。这个过程远比“向量检索+拼接提示词”复杂得多:它要处理非结构化文档的语义切片粒度是否匹配业务问题、要判断检索结果的相关性是否达到生成门槛、要协调多源异构数据(PDF、数据库、API 响应、会议纪要 Markdown)的统一表征、还要在 Agent 多步推理中动态维护知识上下文的一致性。我去年带团队重构一个客服 Agent 时,把 RAG 模块从“后置增强”改成“前置决策引擎”,整个响应准确率从 62% 跃升到 89%,不是因为模型换了,而是我们终于把 RAG 当成管道来设计,而不是当作文档搜索框来调用。所以,这篇讲的不是“RAG 怎么跑起来”,而是:当你决定给 Agent 装上知识获取能力时,你真正要搭建的是什么?它如何影响 Agent 的思考路径、错误模式和扩展边界?哪些设计选择会在三个月后让你半夜改代码?这些,才是第四篇该讲清楚的事。

2. 知识获取管道的三层结构:为什么不能只盯着向量库?

很多人一提 RAG 就直奔 Chroma 或 Qdrant,仿佛装好向量数据库,知识管道就通了。这就像以为装好水泵,整条供水系统就建成了——你忘了水源在哪、水管怎么铺设、水压是否稳定、水质是否达标。真正的知识获取管道,必须拆解为三个不可割裂的层次:数据接入层、语义处理层、生成协同层。每一层的设计缺陷,都会在 Agent 实际运行中以不同方式暴露出来,而且越往后越难修。

2.1 数据接入层:不是“能读就行”,而是“读得准、读得全、读得稳”

这是最容易被低估的一层。很多项目卡在这里,却归因于“模型不行”或“检索不准”。举个真实案例:某制造企业想让 Agent 查设备维修手册。他们直接把 PDF 手册扔进解析器,结果发现 Agent 经常把“轴承型号 SKF 6305-2RS”识别成“轴承型号 SKF 6305-2 RS”,空格位置错了一位,导致后续所有检索全部失效。问题出在哪?不是向量模型,而是数据接入层的文本清洗策略没做领域适配。

这一层的核心任务是:将原始数据转化为机器可理解、业务可信任的中间表示。它包含四个关键子模块:

  • 源适配器(Source Adaptor):不是简单支持“PDF/Word/网页”,而是针对每种源定义提取契约。比如处理 ERP 系统导出的 Excel 报表,必须保留单元格合并逻辑和公式上下文;处理 Confluence 页面,要识别“折叠章节”和“评论区”是否纳入知识范围;处理数据库快照,需明确主键、外键关系是否参与语义建模。我们团队写过一个 Confluence 适配器,光是处理页面版本历史与附件嵌入关系的逻辑就写了 300 行代码,但这决定了 Agent 能否回答“这个配置项在 V2.3 版本中是否被废弃”。

  • 结构化解析器(Structured Parser):对非结构化文档做领域感知切分。通用 PDF 解析器会把一页维修手册切成“标题+正文+表格”,但工程师需要的可能是“故障现象→可能原因→排查步骤→替换部件号”这样的四元组。我们采用基于规则+轻量微调的混合方案:先用正则识别“故障代码:E102”这类强模式字段,再用小模型对段落做意图分类(是描述、是步骤、是警告),最后按业务 schema 重组。实测下来,切片相关性提升 41%,因为 LLM 不再需要自己从大段文字里猜结构。

  • 元数据注入器(Metadata Injector):这是让知识“活起来”的关键。单纯向量化文本,丢失了大量业务上下文。我们在每个文本块注入三类元数据:① 来源可信度(如“内部 Wiki:编辑者为高级工程师,最后更新 7 天内” vs “GitHub Issue:未关闭,标签为 bug”);② 时效性标记(如“SLA 协议:2024Q3 生效”);③ 适用场景标签(如“仅适用于 Linux 环境”、“需配合 v2.1.0 以上固件”)。这些元数据不参与向量化,但在检索后排序和 LLM 提示构造时起决定性作用。

  • 增量同步控制器(Incremental Sync Controller):知识不是静态的。我们见过太多项目,知识库每周手动更新一次,结果 Agent 给销售推荐了已下架的产品参数。我们的方案是:对接 Git 仓库监听 Wiki 更新、用 Debezium 监听数据库变更、对 API 文档源设置 Webhook 回调。同步不是全量重刷,而是计算差异哈希,只更新变更块及其邻近语义单元(比如修改了一个 API 参数说明,连带更新其所属的“请求体结构”和“错误码列表”两个块)。这使知识延迟从小时级压缩到秒级。

提示:别急着选向量库。先用一张白纸画出你的知识来源清单,挨个问:它的更新频率是多少?谁负责维护?变更时是否有明确通知机制?如果某个源中断 24 小时,Agent 降级策略是什么?这些问题的答案,直接决定你该用 Kafka 做流式同步,还是用 Airflow 做定时调度,还是干脆加人工审核开关。

2.2 语义处理层:向量只是工具,语义才是目标

这一层常被简化为“embedding 模型选型”,但真正的挑战在于:如何让机器理解“用户问题”和“知识片段”之间的业务语义距离,而非数学距离。举个例子:用户问“怎么解决 Kafka 消费者组 rebalance 频繁?”——理想的知识片段应该是“rebalance 触发条件:session.timeout.ms 设置过短、心跳线程阻塞、网络抖动”。但如果 embedding 模型只学通用语料,它可能把“rebalance”和“balance sheet”(资产负债表)向量拉得很近,因为它们在财经新闻里共现频繁。这就是语义漂移。

我们解决这个问题,靠的是三层语义对齐:

  • 领域预训练微调(Domain Pre-finetuning):不用从头训大模型,而是用企业内部文档(技术博客、故障复盘报告、设计文档)在开源 embedding 模型(如 bge-m3)上做继续预训练。重点不是增加词汇量,而是调整 token 间的关系权重。比如让“offset”在 Kafka 上下文中更靠近“commit”、“lag”,而不是“偏移量”、“误差”。我们用 2000 篇内部文档微调 2 小时,检索 top-5 准确率从 53% 提升到 76%。

  • 查询重写引擎(Query Rewriter):用户提问往往是口语化、不完整的。LLM 直接检索效果差,因为 embedding 模型没见过“kafka 消费者老掉线”这种表达。我们的方案是:用轻量级 T5 模型做两阶段重写。第一阶段:识别实体和意图(输出:{"entity": ["Kafka", "consumer"], "intent": "troubleshoot", "condition": "frequent disconnect"});第二阶段:生成标准检索查询(“Kafka consumer group frequent rebalance causes and solutions”)。这个模块部署成本低,但让长尾问题检索命中率提升 3 倍。

  • 混合检索策略(Hybrid Retrieval):纯向量检索在精确匹配场景(如查 API 端点 / 查错误码)上不如关键词检索。我们的生产环境强制采用混合策略:先用 BM25 做关键词初筛(召回率优先),再用向量相似度重排序(精度优先),最后用元数据规则过滤(如“只返回 last_updated > 30 days 的文档”)。关键不是加权融合,而是定义清晰的 fallback 逻辑:当向量相似度 < 0.6 且关键词匹配数 = 0 时,直接触发“知识缺失”信号,让 Agent 主动询问用户或切换备用知识源。

注意:别迷信 SOTA embedding 模型。我们测试过多个号称“最强”的开源模型,在内部技术文档检索任务上,经过领域微调的 bge-reranker-base-v2,比未经微调的 text-embedding-3-large 准确率高 22%。模型能力是基础,但业务语义对齐才是胜负手。

2.3 生成协同层:RAG 不是给 LLM 喂食,而是和它协作

这是最常被忽视的一层。很多 RAG 实现把检索结果拼成 prompt 丢给 LLM,然后祈祷它“好好发挥”。但实际中,LLM 会犯两类致命错误:一是过度依赖检索结果,把错误知识当真理(幻觉放大);二是忽略检索结果,坚持用自己的“常识”回答(知识屏蔽)。真正的生成协同,是要建立一套 LLM 可理解、可验证、可追溯的协作协议。

我们采用“三明治式提示工程”(Sandwich Prompting):

  • 底层(Context Sandwich):不是简单拼接“文档1:xxx;文档2:yyy”,而是结构化注入:

    [SOURCE: internal_wiki/kafka_tuning.md | LAST_UPDATE: 2024-05-12 | CONFIDENCE: HIGH] Kafka 消费者组 rebalance 频繁的常见原因: - session.timeout.ms 设置过短(默认 45s),网络抖动易触发 - 心跳线程被阻塞(如消费者处理逻辑耗时 > heartbeat.interval.ms) - 消费者实例数超过 topic partition 数 [END_SOURCE]
  • 中层(Instruction Sandwich):在用户问题前后插入明确指令:

    你是一个资深 Kafka 运维工程师。请严格依据提供的知识片段回答问题,禁止编造任何未提及的信息。若知识片段未覆盖问题,请明确回答“根据当前知识库,无法确定该问题的原因”。 用户问题:怎么解决 Kafka 消费者组 rebalance 频繁?
  • 顶层(Output Sandwich):要求 LLM 输出结构化响应,并标注知识来源:

    根据知识库,Kafka 消费者组 rebalance 频繁的解决方案包括: 1. 调整 session.timeout.ms 至 90s(来源:internal_wiki/kafka_tuning.md) 2. 检查消费者处理逻辑是否阻塞心跳线程(来源:internal_wiki/kafka_tuning.md) 3. 确认消费者实例数未超过 topic partition 数(来源:internal_wiki/kafka_tuning.md)

这套结构让 LLM 的输出具备可验证性:运营人员一眼就能看出答案来自哪份文档,方便快速纠错;也便于后续做 A/B 测试——比如对比“纯指令提示”和“三明治提示”下,Agent 对模糊问题的拒绝率(即不胡说的比例)。

3. RAG 管道的实操落地:从零搭建一个可验证的最小闭环

理论讲完,现在动手。我们以一个真实场景为例:为某电商公司的售后 Agent 搭建“退换货政策知识管道”。目标很明确:当用户问“我买的衣服洗了两次就褪色,能退货吗?”,Agent 必须准确引用《服装类目退换货细则》第 3.2 条,而不是泛泛而谈“支持七天无理由”。

3.1 环境准备与工具链选型:为什么选 LangChain + LlamaIndex + Chroma?

工具选型不是跟风,而是匹配团队能力和运维成本。我们放弃 LangChain 官方 RAG 模板,原因有三:一是其默认 pipeline 过于抽象,调试时难以定位是解析器问题还是检索器问题;二是对元数据支持弱,无法满足我们“按商品类目过滤知识”的需求;三是升级频繁,API 变动让线上服务不稳定。最终选择组合:

  • LangChain:只用其Document和BaseRetriever接口,作为统一抽象层,避免绑定具体实现;
  • LlamaIndex:核心用其VectorStoreIndex和ServiceContext,优势在于对自定义 embedding、query rewrite、rerank 的支持更透明,源码易读;
  • Chroma:轻量、纯 Python、支持内存模式快速验证,且对元数据过滤(where查询)支持完善,符合我们初期快速迭代需求。

实操心得:别一上来就部署 Milvus 或 Weaviate。Chroma 在单机 16GB 内存下,支撑 50 万 chunk 的知识库,QPS 120+,足够验证核心逻辑。等知识量突破百万、并发超 200 时,再考虑分布式向量库。过早优化,90% 的精力都花在运维上,而不是业务逻辑上。

3.2 数据接入实操:PDF 解析的坑与填法

我们的知识源是《售后政策手册》PDF,共 127 页。直接用 PyPDF2 解析,得到的是乱序文本和大量换行符。以下是我们的标准化处理流水线:

# step1: 使用 pdfplumber 精确提取文本和布局信息 import pdfplumber with pdfplumber.open("policy_manual.pdf") as pdf: pages = [] for page in pdf.pages: # 保留表格结构,避免转成纯文本丢失行列关系 tables = page.extract_tables() text = page.extract_text(x_tolerance=2, y_tolerance=2) # 控制字符粘连阈值 pages.append({"text": text, "tables": tables, "page_number": page.page_number}) # step2: 基于规则切分——不是按固定长度,而是按语义单元 def split_by_section(text): # 匹配一级标题:如“第一章 退换货基本原则” sections = re.split(r'^(第[一二三四五六七八九十]+章\s+.+)$', text, flags=re.MULTILINE) chunks = [] for i in range(1, len(sections), 2): if i+1 < len(sections): title = sections[i].strip() content = sections[i+1].strip() # 对内容再按二级标题切分 sub_sections = re.split(r'^(\d+\.\s+.+)$', content, flags=re.MULTILINE) for j in range(1, len(sub_sections), 2): if j+1 < len(sub_sections): sub_title = sub_sections[j].strip() sub_content = sub_sections[j+1].strip() # 关键:为每个块注入元数据 chunk = { "text": f"{title} {sub_title}\n{sub_content}", "metadata": { "source": "policy_manual.pdf", "chapter": title, "section": sub_title, "page_range": get_page_range_from_text(content, pages) # 自定义函数 } } chunks.append(chunk) return chunks

这个脚本的关键不在代码本身,而在于切分逻辑必须由业务专家定义。我们和售后主管一起梳理出 7 类语义单元:政策条款、例外情形、操作步骤、责任界定、时效要求、凭证要求、申诉路径。每类单元的切分规则不同——比如“操作步骤”必须包含动词开头的编号列表,“例外情形”必须包含“但”、“除非”、“然而”等转折词。这确保了后续检索时,Agent 问“退货需要什么凭证?”,不会召回一段讲“谁来承担运费”的条款。

3.3 向量化与索引构建:Embedding 模型的本地化微调

我们选用BAAI/bge-small-zh-v1.5作为基础模型,因为它在中文短文本检索上表现稳健,且参数量小(1.3B),便于本地微调。微调数据来自 200 条真实客服对话:

  • 正样本:用户问题 + 对应政策条款原文(如用户问“衣服褪色能退吗?”,匹配条款“纺织品因洗涤不当导致的褪色,不属于质量问题,不予退货”);
  • 负样本:用户问题 + 不相关条款(如同样问题,匹配“电子商品七天无理由退货规则”)。

使用 HuggingFacetransformers的TrainerAPI 微调 3 个 epoch:

from transformers import TrainingArguments, Trainer from sentence_transformers import SentenceTransformer, losses model = SentenceTransformer('BAAI/bge-small-zh-v1.5') train_examples = [] for q, pos, neg in zip(questions, positives, negatives): train_examples.append(InputExample(texts=[q, pos], label=1.0)) train_examples.append(InputExample(texts=[q, neg], label=0.0)) train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16) train_loss = losses.ContrastiveLoss(model) # 训练... trainer = Trainer( model=model, args=TrainingArguments( output_dir='./bge-finetuned', num_train_epochs=3, per_device_train_batch_size=16, save_steps=100, logging_steps=50, ), train_dataset=train_dataloader, loss=train_loss ) trainer.train()

微调后,我们用内部测试集评估:top-1 准确率从 68% 提升至 89%。更重要的是,模型对“褪色”、“掉色”、“染色不均”等同义词的泛化能力显著增强,不再需要人工维护同义词表。

3.4 检索与生成协同:三明治提示的实际效果

我们构建了一个最小验证 pipeline:

from llama_index import VectorStoreIndex, ServiceContext from llama_index.llms import OpenAILike # 用本地部署的 Qwen2-7B # 加载微调后的 embedding 模型 embed_model = LangchainEmbedding( langchain_embedding=HuggingFaceEmbeddings( model_name="./bge-finetuned" ) ) service_context = ServiceContext.from_defaults( embed_model=embed_model, llm=OpenAILike( api_base="http://localhost:8000/v1", api_key="sk-xxx", model="qwen2-7b" ) ) index = VectorStoreIndex.from_documents( documents=chunks, # 上一步生成的切分块 service_context=service_context ) # 构建三明治检索器 class SandwichRetriever(BaseRetriever): def _retrieve(self, query: str) -> List[NodeWithScore]: # 1. 查询重写 rewritten_query = self.query_rewriter(query) # 调用轻量 T5 模型 # 2. 混合检索 bm25_nodes = self.bm25_retriever.retrieve(rewritten_query) vector_nodes = self.vector_retriever.retrieve(rewritten_query) # 3. 元数据过滤:只取服装类目相关 filtered_nodes = [ n for n in vector_nodes if n.node.metadata.get("category") == "apparel" ] # 4. Rerank 并返回 top-3 reranked = self.reranker.rerank(filtered_nodes, rewritten_query) return reranked[:3] # 构建三明治提示模板 template = ( "你是一名专业售后顾问。请严格依据以下知识片段回答问题,禁止编造。\n" "{context_str}\n" "用户问题:{query_str}\n" "请用中文回答,并在每条结论后标注来源(如:来源《服装类目退换货细则》第3.2条)。\n" "回答:" ) query_engine = index.as_query_engine( retriever=SandwichRetriever(index), text_qa_template=PromptTemplate(template) )

实测效果:当用户问“我买的衣服洗了两次就褪色,能退货吗?”,Agent 返回:

根据《服装类目退换货细则》第3.2条:“纺织品因洗涤方式不当(如使用漂白剂、水温过高、机洗甩干)导致的褪色、变形,不属于产品质量问题,不予退货。”
来源:《服装类目退换货细则》第3.2条

注意,它没有说“建议您联系客服”,也没有说“可以尝试申请”,而是精准引用条款并给出明确结论。这才是知识管道的价值——把模糊的“可能”变成确定的“是/否”。

4. 真实世界中的陷阱与避坑指南:那些没人告诉你的“第二天就崩溃”的问题

RAG 管道在 demo 里跑通,和在生产环境稳定运行,是两回事。以下是我们在 12 个客户项目中踩过的坑,按发生频率排序,附带可立即执行的解决方案。

4.1 知识漂移:文档更新了,但向量没刷新

现象:某金融客户更新了《反洗钱操作指引》,新版本删除了旧版中“客户身份初次识别需留存视频”的要求。但 Agent 仍持续返回旧条款,导致合规风险。

根因:知识同步流程只更新了原始 PDF 文件,但向量索引未触发重建。Chroma 默认不提供“增量更新向量”的 API,必须全量重刷。

解决方案:

  • 在文档存储层(如 MinIO)为每个文件添加etag或version_id元数据;
  • 同步脚本启动时,先比对源文件 etag 与索引中记录的 etag;
  • 若不一致,只删除对应文档的所有 chunk,重新解析、向量化、插入(用upsert而非add);
  • 我们封装了一个ChromaManager类,自动管理 etag 映射和 chunk 粒度更新。

实操心得:永远不要信任“全量重刷”。一个 50 万 chunk 的知识库,全量重刷需 47 分钟,期间服务不可用。我们用 chunk 粒度更新,平均每次更新耗时 1.2 秒,业务无感。

4.2 检索过载:Agent 一次问,RAG 返回 20 个无关片段

现象:用户问“订单号 123456 的物流状态”,RAG 返回了 20 个 chunk,包括“快递公司合作名单”、“物流异常处理 SOP”、“国际运费计算规则”……LLM 上下文爆满,生成结果混乱。

根因:向量检索的 top-k 是固定值(如 k=5),但业务问题类型差异巨大。“物流状态”是精确查询,应返回 1 个权威来源;“如何提升客户满意度”是开放问题,才需要多角度参考。

解决方案:

  • 在查询重写阶段,识别问题类型:用规则匹配(含“订单号”、“单号”、“运单号”等词 → 精确查询);
  • 动态设置 top-k:精确查询 k=1,开放问题 k=5,模糊问题 k=3;
  • 对返回结果做置信度阈值过滤:若最高相似度 < 0.7,直接返回空结果,触发 Agent 的 fallback 逻辑(如调用物流 API)。

我们用一个简单的QueryClassifier类实现:

class QueryClassifier: EXACT_PATTERNS = [r"订单号\s*\d+", r"单号\s*\w+", r"运单号\s*\w+"] def classify(self, query: str) -> str: for pattern in self.EXACT_PATTERNS: if re.search(pattern, query): return "exact" if len(query) < 10: # 短问句通常是精确查询 return "exact" return "open" # 在检索前调用 query_type = QueryClassifier().classify(user_query) top_k = 1 if query_type == "exact" else 5 nodes = retriever.retrieve(query, top_k=top_k)

4.3 元数据失效:过滤条件写错,知识库形同虚设

现象:某医疗客户要求 Agent 只回答“已发布”的临床指南,但检索时仍返回草稿状态的文档。

根因:Chroma 的where过滤语法是{"status": "published"},但我们误写成{"metadata.status": "published"},Chroma 无法识别嵌套字段,静默忽略过滤条件。

解决方案:

  • 所有元数据字段名扁平化:不用{"metadata": {"status": "draft"}},而用{"status": "draft", "updated_at": "2024-05-01"};
  • 在索引构建时,用validate_metadata函数校验字段名合法性;
  • 编写单元测试,模拟各种 where 条件,断言返回结果数量。

注意:Chroma 的元数据过滤不支持LIKE或正则,只能精确匹配。如果需要模糊匹配(如“文档标题包含‘高血压’”),必须用向量检索 + 后过滤,或换用支持全文检索的 Weaviate。

4.4 LLM 拒绝协作:提示词再好,模型也“视而不见”

现象:三明治提示明确要求“标注来源”,但 LLM 仍返回无来源的结论。

根因:Qwen2-7B 的 instruction-tuned 版本,在长上下文下对指令遵循率下降。测试发现,当 context_str 超过 2000 字符,指令遵守率从 92% 降至 63%。

解决方案:

  • 上下文压缩:用LongLLMLingua库对检索结果做无损压缩,保留关键实体和数字,去除冗余修饰词;
  • 指令强化:在 prompt 开头加一行强调:“【重要】你必须在每条结论后标注来源,否则输出将被拒绝!”;
  • 后处理校验:用正则检查 LLM 输出是否含“来源”、“依据”、“根据”等关键词,若未出现,自动触发重试或返回结构化错误。

我们最终采用三级保障:

  1. Prompt 层:指令强化 + 示例演示;
  2. 生成层:设置temperature=0.3降低随机性;
  3. 输出层:正则校验 + 无来源时 fallback 到“知识库暂未覆盖此问题”。

4.5 评估失焦:用 hit-rate 评判 RAG,就像用体重秤量血压

现象:团队用“检索结果是否包含正确答案片段”作为唯一指标,hit-rate 达 95%,但 Agent 实际准确率仅 68%。

根因:hit-rate 只衡量“知识是否存在”,不衡量“知识是否被正确使用”。一个高 hit-rate 的 RAG,可能返回 5 个正确片段,但 LLM 从中挑出最不相关的那个来回答。

解决方案:必须用端到端评估指标:

  • Answer Accuracy:人工标注 100 个问题,看 Agent 最终回答是否正确;
  • Source Faithfulness:检查回答是否忠实于所引来源,有无捏造;
  • Hallucination Rate:统计回答中出现但来源未提及的信息比例;
  • Fallback Rate:Agent 主动承认“知识库未覆盖”的比例,反映系统诚实度。

我们开发了一个RAGEvaluator工具,自动计算这四项指标,并生成热力图:X 轴是问题类型(精确/开放/模糊),Y 轴是知识源(Wiki/API/DB),颜色深浅表示准确率。这让我们一眼看出:对 API 文档类问题,准确率高达 94%,但对 Wiki 中的“最佳实践”类问题,只有 52%——根源是 Wiki 文档缺乏明确结论句,全是描述性文字,LLM 难以提炼。

5. 管道的延伸:当 RAG 不再是管道,而是 Agent 的记忆系统

RAG 基础篇讲到这里,你已经能搭建一个稳定、可验证的知识获取管道。但真正的挑战才刚开始:如何让这个管道,从被动响应,进化为主动记忆?

我们正在做的探索是:把 RAG 从“检索-增强”模式,升级为“记忆-演化”系统。核心思路是——知识不应只是被查询的静态资源,而应是 Agent 在交互中不断验证、修正、沉淀的动态资产。

举个例子:当 Agent 第一次回答“订单 123456 的物流状态”时,它调用物流 API 获取实时数据,并将结果(“已签收,签收时间 2024-05-20 14:30”)作为一条新知识,以高置信度存入 RAG 索引。下次同一用户再问“这个订单什么时候签收的?”,Agent 就不再调用 API,而是直接从知识库检索这条记录。这节省了 API 成本,更重要的是,它让 Agent 具备了“记住用户历史”的能力。

更进一步,当多个 Agent 在不同会话中,都确认了“某快递网点在暴雨天气下平均延迟 2 天”,这条经验就会从临时缓存,晋升为永久知识,进入《物流异常知识库》。这个过程,需要:

  • 反馈闭环:用户点击“回答有帮助”/“不准确”,信号实时回传;
  • 知识蒸馏:用 LLM 对多轮验证的临时知识做摘要,生成结构化新条目;
  • 版本控制:每条知识记录变更历史,支持回滚和审计。

这不是未来概念。我们已在两个客户项目中上线 MVP:一个用于内部 IT 支持,Agent 记住“张工的笔记本 Wi-Fi 驱动问题已通过安装 v2.1.3 版本解决”;另一个用于电商客服,Agent 记住“李女士对‘环保包装’有特别偏好,所有推荐默认启用”。

这条路没有标准答案,但方向很清晰:RAG 的终点,不是让 Agent 更像搜索引擎,而是让它更像一个有经验、会学习、懂你的同事。而这一切,都始于你今天搭好的第一条知识获取管道——它不华丽,但必须坚实。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询