本章摘要: 只有“当前上下文(Context)”的智能体就像只有“金鱼记忆”的实习生,无论能力多强,都无法胜任长周期、复杂背景的任务。 本章将构建智能体的认知纵深。我们将突破单纯的“文本 RAG”,深入探讨多模态混合检索——即如何让智能体在海量的 PDF、图表、照片和日志中,像人类一样“联想”和“查阅”。同时,我们将引入有限状态机(FSM)来约束大模型的发散性,确保任务流程严丝合缝。 核心概念:
Multi-modal Embedding、Hybrid Search、Query Rewriting、Slot Filling、Memory Lifecycle
如果不进分层设计,随着对话变长,Token 成本将呈指数级增长,而检索准确率却会因“大海捞针”效应而下降。我们需要构建一个仿生的记忆金字塔。
请参考以下架构图,理解不同层级的存储介质、读写速度与用途:
[ 智能体 "大脑" (CPU/GPU) ]
^
| (Attention)
+-----------------------------+-----------------------------+
| L1: 工作记忆 (Working Memory / Hot Context) |
| ------------------------------------------------------- |
| * 介质: LLM Context Window (RAM) |
| * 内容: 系统提示词 + 当前轮次对话 + 工具实时返回结果 |
| * 策略: FIFO (先进先出), 滑动窗口 |
| * 成本: $$$ (每次推理都计费) |
+-----------------------------------------------------------+
^ | (写入摘要)
| (注入) v
+-----------------------------------------+-----------------+
| L2: 情景记忆 (Episodic Memory / Session State) |
| ------------------------------------------------------- |
| * 介质: NoSQL / Redis / JSON |
| * 内容: 对话历史摘要, 用户当前意图, 槽位状态(Slots) |
| * 策略: 读写频繁, 随会话结束而归档 |
+-----------------------------------------+-----------------+
^ | (沉淀/归档)
| (检索/Recall) v
+-----------------------------------------+-----------------+
| L3: 语义记忆 (Semantic Memory / Long-term Knowledge) |
| ------------------------------------------------------- |
| * 介质: Vector DB + 搜索引擎 (ElasticSearch) |
| * 内容: 公司文档, 维修手册(PDF), 历史工单库, 知识图谱 |
| * 策: 静态为主, 周期性更新, 混合检索 |
+-----------------------------------------------------------+
在多模态场景下,用户的问题往往是隐晦的。比如用户拍了一张红灯闪烁的照片问:“这怎么修?” 如果你只检索文本“这怎么修”,结果将是灾难性的。
我们如何把 PDF 中的图文存入数据库?
| 策略 | 描述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| A. Image-to-Text (Captioning) | 用 VLM 把图变成文字描述,存入文本向量库。 | 兼容现有纯文本 RAG 架构。 | 丢失细节(颜色深浅、微小划痕、空间关系)。 | 通用文档检索。 |
| B. Cross-Modal Embedding | 使用 CLIP/SigLIP 等模型,将 Text 和 Image 映射到同一向量空间。 | 支持“以文搜图”和“以图搜图”。 | 需要专门的向量库支持;难以处理含大量文字的图。 | 电商搜图、场景匹配。 |
| C. ColPali / Late Interaction | 保留图像的 Patch Embedding,与文本 Token 直接进行交互(前沿技术)。 | 极高的多模态理解力,无需 OCR 中间层。 | 计算开销大,存储成本高。 | 复杂图表、技术图纸解析。 |
这是 RAG 成功的关键。用户输入通常是不完整且多模态的。
架构流程图:
用户输入: [Image: 仪表盘亮灯] + "这个灯亮了,怎么关掉?"
|
v
[ 1. 理解与改写 (Rewriter Agent) ]
|-- 分析图片 --> 识别出物体: "Honda CR-V 2023", 识别文字: "Check Engine"
|-- 补全指代 --> 将"这个灯"替换为"Engine Warning Light"
|-- 意图扩展 --> 增加同义词: "Turn off", "Reset", "Troubleshoot"
|
v (生成多路 Query)
|
+------+--------------------------+-------------------------+
| Route A: 关键词检索 (BM25) | Route B: 向量检索 (Dense) | Route C: 视觉相似度 (Visual)
| "Honda CR-V Check Engine Reset" | Embedding(语义描述) | Embedding(用户原图)
| (擅长专有名词匹配) | (擅长概念匹配) | (擅长外观匹配)
+------+--------------------------+-------------------------+
| | |
v v v
[ 2. 混合重排序 (Hybrid Rerank) ]
|-- 统一分数 = w1*BM25 + w2*Vector + w3*Visual
|-- 剔除相似度 < 0.6 的噪声
|
v
[ Top-K 结果注入 Context ]
知识库中的文档可能过时,或者图片与文字有冲突。 策略:
简单的 Chain-of-Thought (CoT) 不足以支撑长流程任务。我们需要有限状态机 (FSM) 来管理任务进度。
以“设备报修”为例,Agent 的行为应由当前 State 决定。
State: [ INITIAL ]
|-- Event: 用户打招呼 --> Action: 问候, 转 [ CLARIFY_INTENT ]
|
State: [ CLARIFY_INTENT ]
|-- Event: 用户说"修电脑" --> Action: 询问设备型号, 转 [ COLLECT_INFO ]
|-- Event: 用户说"查询进度" --> Action: 调用查询工具, 转 [ CHECK_STATUS ]
|
State: [ COLLECT_INFO ] (关键: 槽位填充)
|-- Check: 缺少 Serial_Number? --> Action: 追问序列号
|-- Check: 缺少 Error_Photo? --> Action: 追问故障截图
|-- Check: 全部收集完毕? --> Action: 生成工单, 转 [ SUBMIT ]
|
State: [ SUBMIT ]
|-- Action: 调用 API 提交, 返回结果, 转 [ END ]
在 COLLECT_INFO 状态下,Agent 的核心目标不是聊天,而是填满 JSON Schema。
System Prompt 示例:
“你现在的任务是收集故障信息。你需要填满以下字段:
[device_model, error_code, user_location]当前已知:device_model='Printer X'。请只询问缺失的字段,不要闲聊。”
如果知识库里有 2021 年的手册和 2024 年的手册,Embedding 很接近,Agent 很容易混淆。 解决方案:
WHERE year = 2024。用户上传的图片可能包含人脸、车牌或密码贴纸。
说明:思考后点击箭头查看参考思路。
场景:你的 Agent 接入了一个上下文限制为 8k 的模型。系统提示词占用了 1k。此时用户上传了一个 50 页的 PDF(提取文字后约 20k token)并询问全文总结。 问题:你不能直接把全文塞进去。请提出两种低成本的处理策略。
场景:设计一个“会议室预定助手”。 问题:定义一个 JSON Schema,包含预定所需的必要槽位。并写出一个 System Prompt 的片段,指导 Agent 当用户只说“我要定明天的会”时该怎么做。
场景:你需要建立一个“服装设计灵感库”,设计师会输入“这种波西米亚风格的领口”并上传一张草图,希望找到历史上相似的衣服。 问题:你应该选择 Captioning + Text Search 还是 Visual Embedding Search?为什么?
场景:你正在做一个医疗建议 Agent。数据库里有一篇医学论文,里面提到了“某种草药在小白鼠身上实验有效,但人类服用有剧毒”。 问题:用户问:“这种草药人能吃吗?”。普通的 RAG 可能会检索到“有效”这个词,导致 Agent 回答“有效”。如何从数据处理或检索策略上避免这种致命错误?
场景:用户正在组装一台复杂的机器(耗时 3 天)。
pdf_to_text。{"text_chunk_id": "101", "linked_image_ids": ["img_03", "img_04"]}。检索到文字时,连带把关联图片一起召回。