目录
1Agent 推理模式有哪些?ReAct 是啥?具体是怎么实现的?
2什么是推理模式?
3ReAct、Plan-and-Execute、Reflection 三种范式有什么核心区别?实际项目中该如何选型?
4设计范式和推理模式的区别?
5 复杂任务怎么做的任务拆分?为什么要拆分?效果如何提升?
6请你介绍一下 AI Agent 的记忆机制,并说明在实际开发中应该如何设计记忆模块?
存什么?
怎么存?
什么时候取出来用?
7Context Window 管理:短期记忆的「工作台」不够大怎么办
8Agent 的长短期记忆系统怎么做的?记忆是怎么存的?粒度是多少?怎么用的?
9什么是 Multi-Agent?
Multi-Agent 之间的协作方式有哪些?
10说说 Single-Agent 和 Multi-Agent 的设计方案?
怎么做选型决策?
11Agent 记忆压缩通常有哪些方法?
12 在工程实践中,为什么有时候选择「手搓」Agent,而不是直接用成熟框架?
13如何赋予 LLM 规划能力?
14讲讲 Agent 的反思机制?为什么要用反思?具体怎么实现?
15如何设计多 Agent 的协作与动态切换机制?
16Agent 的上下文工程怎么设计?
17Context Engineering 和 Prompt Engineering 有什么区别
18Agent 的多轮对话状态如何管理?如何防止跑偏并支持中断恢复?
19如何评估一个 Agent 的效果?评测集和指标怎么设计?
9月25日20Agent 为什么会出现路径震荡、重复调用和死循环?怎么检测和治理?
21线上 Agent 延迟明显升高时,如何通过 Trace 定位和优化?
22Multi-Agent 系统如何处理子 Agent 超时、失联和并发修改冲突?
23 Agent 的「任务幻觉」是什么?如何避免没有执行工具却声称任务已经完成?
24大模型或 Agent 连接数据库时,如何防止越权、敏感数据泄漏和查询幻觉?
25总结
本文围绕 AI Agent 工程化落地中的一系列核心问题展开,从推理模式、任务拆分、记忆机制,到 Multi-Agent 协作、上下文工程、状态管理与效果评估,再到路径震荡、任务幻觉、数据库安全等线上治理难题,系统梳理了从原理到实战的完整链路。目标读者是正在或准备构建 Agent 系统的算法工程师、后端开发者和技术负责人。读完本文,你将掌握主流推理范式与选型思路,理解记忆与上下文的设计要点,学会用 Trace 定位线上问题、用评测体系守住质量底线,并能在工程实践中规避越权、泄漏与幻觉等高风险陷阱。
1Agent 推理模式有哪些?ReAct 是啥?具体是怎么实现的?
Agent 的推理模式我用过几种。
最基础的是直接输出答案,没有中间推理;CoT 是让 LLM 先把推理过程写出来再给答案,准确率更高;ReAct 是在 CoT 基础上加了「行动」,让 LLM 交替输出思考和工具调用,每次行动后再根据结果继续思考,形成一个循环。
我觉得 ReAct 是目前 Agent 用得最广的模式,因为它推理过程可见,又能动态利用外部工具,两个优点都有。
2什么是推理模式?
LLM 逐个 token 生成,复杂任务直接输出答案容易中间步骤出错。推理模式就是一套思考范式,把隐式思考变成显式分步推导。
- CoT:一步步思考,但不能调用外部工具;
- ReAct:思考 + 行动交替循环,可以调用工具,是工业 Agent 最主流;
- Plan‑and‑Execute:先整体规划再执行;
- Reflection:执行完成后反思纠错。
3ReAct、Plan-and-Execute、Reflection 三种范式有什么核心区别?实际项目中该如何选型?
我理解这三者是 Agent 开发里最主流的三种设计范式,核心区别在于「决策和执行的关系」。
ReAct 是边想边干,走一步看一步,单步迭代实时调整,灵活度最高;Plan-and-Execute 是先想全再干,先定完整计划再分步执行,适合长流程复杂任务,不容易跑偏;Reflection 不是独立的完整流程,而是给前两者加的「检查修正 buff」,用来提升输出质量。
实际选型就看三个维度:任务复杂度、流程确定性、输出质量要求,新手入门首选 ReAct,复杂任务用 Plan-and-Execute,高要求场景再加 Reflection。
4设计范式和推理模式的区别?
推理模式,描述的是大模型自身的思考方式,属于模型内部逻辑。比如 CoT 思维链,让模型分步思考;ReAct 推理模式,让模型交替输出思考和行动。它大多通过 Prompt 提示词来实现,重点改变模型思考的过程。
设计范式,是工程架构层面,定义整个智能体系统由哪些组件、模块如何编排流转。典型范式有 ReAct 范式、规划执行 Plan‑and‑Execute、多智能体、Workflow 工作流范式。
简单说:推理模式解决 “模型怎么想”;设计范式解决 “系统怎么做”。
设计范式是公司的管理制度,推理模式是员工的干活方法
5 复杂任务怎么做的任务拆分?为什么要拆分?效果如何提升?
我理解任务拆分的原因是 LLM 一次性处理太复杂的任务很容易出错,把大任务拆成小步骤,每步聚焦一件事,准确率会明显提升。
拆分方式主要有两种:一种是静态拆分,提前把步骤写死;另一种是动态拆分,让 LLM 自己根据目标规划步骤,更灵活但也更难控制。
拆完之后步骤之间可能有依赖关系,我的经验是把能并行的步骤并发跑,端到端延迟可以降很多,有时能降 40% 到 60%。
6请你介绍一下 AI Agent 的记忆机制,并说明在实际开发中应该如何设计记忆模块?
Agent 需要记忆才能在多步任务中保持状态、跨任务积累知识。
记忆机制分四层:感知记忆(当前输入的原始内容)、短期记忆(context window 里的对话历史)、长期记忆(存在外部数据库、语义检索召回)、实体记忆(结构化提取的关键事实)。
实际设计时要解决三个核心问题:存什么、怎么存、什么时候取出来用,根据信息类型选合适的存储方式,再搭配主动检索和按需检索两种策略使用。
存什么?
怎么存?
需要语义检索的内容,比如文档知识、对话摘要这类非结构化的文本,适合存进向量数据库,用 embedding 编码后通过相似度检索。结构化的用户偏好和状态字段,比如语言偏好、项目配置这些可以精确查询的内容,更适合用关系数据库或 Key-Value 存储,查询速度快,不需要语义理解。整段文档或知识库则适合存进向量数据库,配合 RAG 流程做召回。
混合存储是主流做法:结构化的偏好字段用关系数据库精确查,非结构化的知识和历史用向量数据库语义检索,两者配合使用。
什么时候取出来用?
第一种叫「主动检索」,在任务开始前,用当前任务的描述去检索相关记忆,把结果注入 system prompt 作为背景知识。这样 Agent 一开始就带着「历史记忆」进入任务,不需要用户每次重新交代背景。第二种叫「被动触发」,Agent 在推理过程中,判断当前步骤需要某类特定知识时,主动发起检索。具体做法是把「查记忆」封装成一个 Tool,让 Agent 自己决定什么时候调。这种方式更灵活,但依赖模型判断什么时候该去查。</p>
实践上两种结合效果最好:session 开始时做一次主动检索,把关于用户偏好和背景的记忆加载进 system prompt;任务执行过程中,遇到需要专业知识或历史数据的步骤,再让 Agent 按需检索。
7Context Window 管理:短期记忆的「工作台」不够大怎么办
短期记忆存在 context window 里,而 context window 是有 token 上限的。一个复杂的多步任务,对话历史越来越长,工具返回的结果越来越多,很快就会把 context window 塞满。满了之后新的内容就进不去了,或者被迫截断早期的历史,Agent 就会「失忆」,不知道前面做了什么。
这个问题在实际项目中非常常见,解决方案有好几种思路,从简单到复杂都有。
最简单的是「滑动窗口」,只保留最近 N 轮对话,更早的历史直接丢弃。好处是实现简单,代价是早期的重要信息可能被丢掉。比如用户在第一轮就说了「所有代码用 TypeScript」,到了第十轮这条信息被滑出窗口了,Agent 又开始写 JavaScript,用户就会很崩溃。
进阶一点的做法是「摘要压缩」。当历史长度接近上限时,用 LLM 把早期的对话历史压缩成一段摘要,替换掉原始的冗长历史。比如把前面十轮的详细对话压缩成「用户要求用 TypeScript 编写一个 REST API,已完成数据库设计和路由定义,当前正在实现用户认证模块」,一段话就把关键信息保留了,token 占用从几千降到几百。代价是压缩过程本身会丢失细节,而且需要额外的 LLM 调用来做摘要。
还有一种做法是把<不常用但重要的信息「卸载」到长期记忆里>。执行过程中产生的中间结果,如果当前步骤不需要但后面可能用到,就先存到向量数据库里,从 context window 中移除,等后面某步需要时再检索回来。这相当于给工作台配了一个「抽屉」,桌面放不下的东西先收到抽屉里,要用的时候再拿出来。
这三种传统方案已经能解决大部分场景的问题了,但最近两年出现了一些专门为 Agent 记忆设计的开源框架,把上面这些策略做了更系统的封装,值得了解一下。
Mem0是目前社区最活跃的 Agent 记忆框架之一(GitHub 上超过 5 万星),它的核心思路是把记忆管理做成一个独立的服务层。你只需要调用
memory.add()存记忆、memory.search()查记忆,底层的 embedding、去重、冲突消解它全帮你做了。Mem0 特别适合「个性化记忆」场景,比如记住每个用户的偏好和习惯,它可以按user_id做记忆隔离,不同用户的记忆互不干扰。而且它同时支持向量存储和图存储(知识图谱),在需要关系推理的场景也能用。Letta(前身就是大名鼎鼎的 MemGPT)走的是另一条路,它的设计灵感来自操作系统的内存管理。就像操作系统把内存分成多个层级(寄存器、缓存、主存、磁盘),Letta 也把 Agent 的记忆分成了三个层级。
Core Memory 是始终留在 context window 里的核心信息(比如用户画像、当前任务目标),类似于操作系统的主存,随时可读可写;Recall Memory 是最近的对话历史,类似于缓存,按时间顺序存储,支持快速回溯;Archival Memory 是长期归档的知识,类似于磁盘,容量无限但检索需要主动发起。
最有意思的一点是,Letta 让 Agent 自己通过工具调用来管理这三层记忆,Agent 会自己决定什么时候把信息从 Core Memory 移到 Archival Memory,什么时候从 Recall Memory 里检索旧对话。这种「让 Agent 自己管理记忆」的思路,比固定规则更灵活,但也更依赖模型的判断能力。
还有一个值得关注的是Zep(及其开源组件 Graphiti),它的独特之处在于引入了「时间感知」的概念。很多记忆框架只存内容不存时间,但 Zep 会给每条记忆标注「有效时间窗口」,比如「用户的预算是 5 万」这条记忆可能在三个月后就过期了。它通过时序知识图谱来管理记忆的生命周期,自动识别哪些记忆已经过时,哪些仍然有效,这在长期运行的 Agent 系统中非常实用。
8Agent 的长短期记忆系统怎么做的?记忆是怎么存的?粒度是多少?怎么用的?
我理解记忆系统分两层。
短期记忆就是 context window 里的对话历史,存当前任务的中间状态,任务结束就清掉;长期记忆用向量数据库存,把信息 embedding 后写入,用的时候做语义检索拿回来注入 prompt。
粒度上我通常按「一次完整交互」或「一个关键事件」为单位存,太细碎检索噪音大,太粗糙又丢失细节,这个需要根据业务实际调整。
9什么是 Multi-Agent?
多智能体系统(Multi-Agent)就是多个 Agent 协作完成任务,每个 Agent 各有分工,有的负责搜索、有的负责写代码、有的负责做评审。
我理解单个 Agent 主要受两个限制:一是 context 窗口大小,复杂任务信息量一多就撑爆了;二是单点能力,什么都让一个 Agent 做,每件事都是泛才。
Multi-Agent 通过专业分工和并行执行,能处理更复杂、更长流程的任务,这是我在实际项目里选择多智能体方案的核心原因。
Multi-Agent 之间的协作方式有哪些?
第一种是顺序流水线(Sequential Pipeline),Agent A 做完把结果交给 Agent B,B 做完交给 Agent C,就像工厂流水线一样,每个环节依次处理。第二种是并行扇出(Fan-out),一个调度者把多个独立子任务同时分发给不同的 Worker Agent,它们各自并行执行,最后由调度者收集汇总。第三种是辩论 / 评审模式(Debate/Review),多个 Agent 对同一个问题各自给出方案,然后由一个裁判 Agent 或者它们互相评审来筛选最优解,这种模式在需要高质量决策的场景特别有用,比如代码评审、方案选型。
10说说 Single-Agent 和 Multi-Agent 的设计方案?
Single-Agent 适合任务流程清晰、复杂度适中的场景,实现简单、好维护;Multi-Agent 适合需要专业分工、任务量大或者需要并行执行的复杂场景。
Multi-Agent 架构上主要有两种拓扑:中心化的 Orchestrator 模式,由一个主 Agent 统一调度各个 Worker;去中心化的 Peer-to-Peer 模式,Agent 之间直接通信。
怎么做选型决策?
选型的逻辑其实可以用两个问题来搞定。
先问第一个问题:你的任务,Single-Agent 能搞定吗?如果任务流程明确、不太长、不需要多种专业分工,Single-Agent 就够了。架构简单、维护成本低、链路透明,不要为了「显得高级」而引入 Multi-Agent。
如果任务确实超出了 Single-Agent 的边界,再问第二个问题:你能接受系统行为不可控的风险吗?生产环境里这个问题的答案几乎一定是「不能」,所以就用 Orchestrator 模式。
实际工程里有一个很实用的策略叫渐进式演进:先用 Single-Agent 把系统跑起来,当你发现某个环节确实成为瓶颈了,比如 context 经常撑满、某类子任务质量不行,再把那个环节拆出来交给一个专门的 Worker Agent。不要一上来就设计一个五六个 Agent 的复杂系统,你可能连哪里是真正的瓶颈都还没搞清楚。从 Single-Agent 演进到 Multi-Agent 是一个自然的过程,而不是一开始就做的架构决策。
11Agent 记忆压缩通常有哪些方法?
记忆压缩常见有四种方法:摘要压缩、滑动窗口、重要性过滤、结构化抽取。
摘要压缩是把长对话总结成简短摘要;滑动窗口是只保留最近 N 轮对话;重要性过滤是打分筛选,只留重要内容;结构化抽取是把关键信息抽成结构化数据存起来。
我在实际项目里最常用的是摘要压缩和滑动窗口,而且经常组合用,滑动窗口丢弃前先做一次摘要,尽量不丢重要信息。
12 在工程实践中,为什么有时候选择「手搓」Agent,而不是直接用成熟框架?
我的感受是框架用起来快,但有几个实际痛点。
第一是抽象层太多,调试的时候不知道哪步出了问题,得一层层往下扒;第二是版本升级经常有破坏性变更,线上稳定性难保证;第三是框架的通用设计往往和具体业务需求有偏差,定制起来反而更费劲。
手搓的代码完全在自己掌控之内,可观测性好、出问题好排查,也更方便做性能优化。所以我现在的策略是核心逻辑手写,只在边缘功能上用框架的工具。
13如何赋予 LLM 规划能力?
给 LLM 加规划能力主要靠这几种思路。
- CoT 是让 LLM 把推理步骤写出来,线性地一步步推导到答案;
- ToT 是让它同时探索多条推理路径,选最优的继续深入;
- GoT 是图结构推理,推理节点可以复用和合并,适合更复杂的任务。
工程上我用 CoT 最多,因为实现成本最低,就是改个 prompt;ToT 效果更好但调用次数多,成本大概是 3 到 5 倍;GoT 目前还比较学术,生产环境我没见过有人真正落地用的。
14讲讲 Agent 的反思机制?为什么要用反思?具体怎么实现?
反思机制我的理解是:让 Agent 在完成一个步骤或整个任务后,自我评估输出质量,判断有没有问题,不达标就重试或调整策略。
用反思的原因是 LLM 第一次输出不一定是最优的,加一轮自我检查能显著提升质量,相当于人写完东西自己再看一遍。
代价是多至少一次 LLM 调用,token 消耗和延迟都会增加,所以我在工程里通常只在质量要求高的关键节点启用反思,不是每步都做。
15如何设计多 Agent 的协作与动态切换机制?
16Agent 的上下文工程怎么设计?
我会把 Agent 的上下文工程设计成一个运行时装配流程,而不是把所有信息长期堆在一个 Prompt 里。每次模型调用前,先根据当前子任务,从指令、用户需求、结构化任务状态、短期对话、长期 Memory、工具定义与结果、RAG 证据中挑选本轮需要的内容,再完成优先级排序、来源隔离和 Token 分配。
其中,System、Developer 和 User 指令负责告诉模型「要做什么、不能做什么」,任务状态里的目标、约束、To-Do、当前步骤和已完成结果负责告诉模型「现在做到哪了」,Memory、RAG 和工具结果则补充「完成这一步需要知道什么」。旧记忆和外部资料都不能覆盖更高优先级指令,网页、文档和工具返回值也必须按数据处理,不能混成新的命令。
工程上我会先预留输出空间,再给各类上下文设预算和不可丢失项。超出预算时,优先去重、裁剪低相关证据和无关工具,最后才压缩旧历史。同时把执行后的状态增量写回外部状态库,让下一轮重新按当前步骤装配,而不是让模型只靠聊天记录记住一切。
17Context Engineering 和 Prompt Engineering 有什么区别
这两个概念最容易混在一起。
Prompt Engineering 主要在设计「怎么说」,比如角色怎么描述、任务怎么拆、输出格式怎么约束、Few-shot 示例怎么写。它关注的是指令和模板本身是否清晰、稳定。
Context Engineering 关注的是「这一轮让模型看到什么」。除了 Prompt,还包括从哪里取任务状态、召回哪段 Memory、开放哪些工具、放哪些 RAG 证据、如何处理工具结果,以及这些内容怎么排序、隔离和控制预算。它贯穿 Agent 的整个运行过程,是动态的。
Memory 则更像仓库,负责跨时间保存和召回信息;上下文是工作台,只摆本轮需要的内容。记忆压缩是在仓库或工作台太拥挤时,降低内容体积的一类方法。RAG 是给工作台找资料的机制,也不等于上下文工程本身。
一句话区分就是:Prompt Engineering 把话写清楚,Memory 把信息存下来,RAG 把证据找回来,Context Engineering 决定这一次到底把哪些东西摆到模型面前。
18Agent 的多轮对话状态如何管理?如何防止跑偏并支持中断恢复?
我会先把信息分成四类,而不是把所有内容都塞进 messages:对话历史保留用户和模型说过的原话,业务状态保存已经确认的实体与约束,任务状态记录目标、当前步骤和工具执行进度,长期记忆只保存跨任务仍然有价值的用户偏好与历史经验。
当前任务里,我会显式维护 core_intent、current_subtask、pending_tools、completed_steps 和 context_snapshot。每轮先判断用户输入是在补充、纠错、回答澄清问题,还是明确切换任务,再更新结构化状态。core_intent 是意图锚点,模型不能自行覆盖,但用户确认换题时可以创建新任务,或者生成一个新版本。
执行层用状态机控制合法流转,例如 PLANNING -> EXECUTING -> WAITING_USER -> CHECKING -> DONE。自然语言历史负责保留语气、原因和细节,状态机负责决定现在能做什么,两者配合,不能互相替代。
为了支持中断恢复,我会按 session_id 或 thread_id 隔离会话,再用 task_id 标识具体任务,在关键步骤保存 checkpoint。恢复时加载最近一次已提交状态,并核对未决工具调用。所有写外部系统的动作都要带稳定的幂等键,不能简单地从失败位置再执行一遍,否则可能重复付款、重复发消息。
19如何评估一个 Agent 的效果?评测集和指标怎么设计?
我评估 Agent 时不会只看最终答案,而是分四层。
工具层看该不该调用、工具选得对不对、参数和返回处理是否正确;单步与轨迹层看每一步决策是否合理,有没有漏步骤、重复调用、越权或绕过必要流程;端到端层看任务最终是否完成,外部环境状态是否达到目标;线上层再看真实业务里的成功率、用户接管率、延迟、Token、成本和安全事件。
评测集主要来自真实用户请求、历史 Badcase、边界场景和对抗样本。每条样本不只保存问题和参考答案,还要保存目标状态、允许或禁止的动作、关键检查点和评分规则。对于有多条正确路径的任务,不强行要求轨迹逐步完全一致。
评分时我会把确定性检查放在最前面,能用 Schema、数据库状态、单元测试和权限规则判断的,就不用大模型猜。开放式质量再交给人工和 LLM-as-a-Judge,但要用人工样本校准裁判,并防范位置、篇幅和自我偏好等偏差。
最后,把安全和关键业务约束设成发布硬门禁,其余指标按核心任务和场景切片与基线比较。上线后通过 Trace、用户反馈和业务结果发现 Badcase,再回流到离线集,形成持续回归闭环。
9月25日20Agent 为什么会出现路径震荡、重复调用和死循环?怎么检测和治理?
Agent 出现路径震荡,常见原因是目标和停止条件模糊,工具失败后只返回空结果,任务状态没有随执行结果更新,或者多 Agent 的职责边界不清,交接时形成 A -> B -> A 的循环。
我会在调度层记录每一步的 Agent、工具、标准化参数、结果摘要和执行前后的状态。检测时结合动作指纹、输出相似度、状态变化和 Agent 调用图,并用步数、时间、Token、成本和交接次数作为全局预算。 单纯动作重复只是预警,「状态长时间没有向完成标准推进」才是更可靠的循环信号。
触发预警后,我会先区分临时性错误和无进展循环。临时性错误走有界重试和退避;参数或权限错误直接修正或询问用户;执行路径没有进展时,禁用当前失败路径,改用其他参数或工具,必要时从检查点重新规划。预算耗尽或风险越界后,系统停止自动执行,将已完成结果、卡点和可选方案交给用户或人工处理。
21线上 Agent 延迟明显升高时,如何通过 Trace 定位和优化?
我会先确认慢的是 TTFT,也就是用户多久看到第一个 Token,还是总时延,也就是任务从接收到完成一共用了多久。然后按任务类型、模型版本、工具、租户和发布时间切分 P50、P95、P99,先判断是整体都变慢,还是只有少量长尾请求出问题。
接着,我会用同一个 Trace ID 串起网关、排队、上下文构建、检索、模型调用、工具调用、编排决策和最终生成。每个环节建独立 Span,记录耗时、状态、重试次数、输入输出规模、Token 数和错误类型,但不直接记录密码、完整提示词等敏感内容。
定位时先用指标圈定异常范围,再抽取慢 Trace 和正常 Trace 做对比,从瀑布图里找关键路径。重点看排队时间是否上涨,模型 TTFT 或生成速度是否变化,检索和工具是否出现长尾,Agent 步数和重试次数是否膨胀,以及原本能并行的步骤是否被串行执行。
优化要对症下药。排队问题做容量和并发治理,模型问题从路由、上下文、输出长度和缓存入手,检索与工具问题考虑连接复用、缓存、批量和安全并行,编排问题则减少无效步骤、重复调用和过度反思。修改后通过历史轨迹回放、灰度和分位数对比验证,同时守住任务成功率、答案质量、安全和成本,不能只把耗时压下来就算成功。
22Multi-Agent 系统如何处理子 Agent 超时、失联和并发修改冲突?
我会先把「通信问题」和「一致性问题」分开。心跳中断只能说明协调器暂时看不到子 Agent,不能直接证明它已经停止。任务分配时应该带租约和递增的执行代次,子 Agent 定期续租;租约过期后协调器才能安排接管,旧执行者即使恢复,也不能再用过期代次提交结果。
接管不能简单从头重跑。我会保存任务 checkpoint,记录已经完成的步骤、产物版本和外部副作用。重试使用稳定的任务 ID、步骤 ID 和幂等键,遇到结果未知的写操作先查询外部系统,再决定继续、补偿还是人工确认。连续失败时还要支持换模型、换工具、拆小任务和人工接管等降级路径。
多个 Agent 修改同一个仓库时,先按任务依赖和文件所有权尽量减少重叠写入,再让每个 Agent 在独立 worktree 或 branch 中工作。提交时校验基线版本,对普通文件采用乐观并发,对少数热点文件使用带租约的短锁。最终只有 Integrator 有权合入目标分支,它按依赖顺序合并,并运行静态检查、单元测试和集成测试。出现文本冲突或语义冲突时,把最新基线、冲突原因和失败测试交回对应 Agent 修正,而不是让多个 Agent 直接抢写主分支。
23 Agent 的「任务幻觉」是什么?如何避免没有执行工具却声称任务已经完成?
Agent 的「任务幻觉」是指它把计划、尝试或者一段看起来成功的工具输出,当成了真实完成,并向用户作出与外部状态不一致的声明。它和普通文本幻觉的区别在于,普通幻觉主要是事实说错了,任务幻觉还可能让用户误以为退款、发信、改代码这些动作已经发生。
我会把模型定位成决策者,而不是事实裁判。调度层用代码维护任务状态机,只有真正调用工具、保存执行回执,并通过数据库查询、资源读取、单元测试等确定性方式验证目标状态后,任务才能从「执行成功」进入「已验证」。最终回复只能根据这份已验证状态生成。
遇到调用超时,也不能直接当失败重试,因为动作可能已经执行。系统要给有副作用的请求设置幂等键,再通过请求 ID 或业务状态查询结果。暂时查不清时就明确返回「结果待确认」,不能把未知包装成成功。
评测时则要专门构造未调用工具、伪造成功返回、异步未完成、响应丢失、陈旧缓存和部分成功等样本,重点统计错误完成声明率、证据覆盖率、重复副作用率和未知状态处理正确率,并把错误完成声明设成上线硬门禁。
24大模型或 Agent 连接数据库时,如何防止越权、敏感数据泄漏和查询幻觉?
我不会把 Prompt 当成安全边界,也不会让模型拿着高权限账号直接执行任意 SQL。用户身份和租户范围来自可信的登录态,由网关传给策略层;模型只负责表达查询意图,真正的授权要在模型之外逐次校验。
数据库侧遵循最小权限。查询 Agent 使用独立的只读账号,只开放必要的库、表、视图和列,再用行级策略强制租户隔离。能封装成「查订单」「统计销售额」这类业务工具的,就不暴露通用 SQL。必须做 Text-to-SQL 时,要用 SQL 解析器检查语法树,对语句类型、表、列、函数和查询规模做 Allowlist,再通过参数化查询、只读事务、超时和行数限制执行。
敏感数据要从源头最小化,优先查询脱敏视图和聚合结果,进入模型前后都做字段裁剪与脱敏。数据库中的文本也属于不可信数据,里面即使出现「忽略规则」之类的内容,也只能作为数据展示,不能改变工具权限或执行策略。
查询安全不等于查询正确。系统还要校验字段是否存在、指标口径、租户过滤、时间范围和结果合理性,并保存查询依据。高风险写操作则使用独立工具,先预览变更,再经过权限校验和人工审批,最后依靠事务、幂等、影响行数限制和审计日志兜底。
25总结
本文围绕 AI Agent 工程化落地中的一系列核心问题展开,从推理模式、任务拆分、记忆机制,到 Multi-Agent 协作、上下文工程、状态管理与效果评估,再到路径震荡、任务幻觉、数据库安全等线上治理难题,系统梳理了从原理到实战的完整链路。目标读者是正在或准备构建 Agent 系统的算法工程师、后端开发者和技术负责人。读完本文,你将掌握主流推理范式与选型思路,理解记忆与上下文的设计要点,学会用 Trace 定位线上问题、用评测体系守住质量底线,并能在工程实践中规避越权、泄漏与幻觉等高风险陷阱。