HungryNeko avatar HungryNeko HungryNeko's Blog, 又是一条咸鱼呢...

全功能的 AI Agent 构建经验

· Tech · AI Agent / LangGraph / MCP / RAG

English version

AI Agent 界面,包含对话、数据、模型、自动化、MCP 和系统标签
重构后的 AI Agent 界面,包含对话、数据、模型、自动化、MCP 和系统等视图。

之前做了一个有 AI 帮助的租房中介 AI Agent,最近重构了一部分代码,并且增加了标准的 MCP 等功能。

我在做 AI Agent 过程中遇到过各种有趣的问题,想要记录下来。

租房系统介绍 / AI Agent GitHub

关于 AI Agent 的对话

以前做 AI Agent 遇到过很多问题,简单来说,AI Agent 的制作是越简单,越有效。

以前做 AI Agent 我尝试解决很多上下文的问题,例如尝试让 AI 在每个对话结束时都总结一次前文,后续的对话只告诉模型总结的历史,而不是每一次的具体对话。

但是这样并不能让 AI Agent 更省 token,实际上 LLM 的上下文长度已经足够长了,这样每次总结反而让 AI 难以理解上下文,导致工作效果下降。

同时我曾经尝试在每次对话都详细地告诉 AI 各种工具的大致功能和调用方法,但是我发现这样反而让 AI 因为上下文混乱而难以理解操作,让模型不停犯错。

当前我改为了仅在太长文本等有需要的时候整体压缩上下文,否则直接给 LLM 所有的历史内容,LLM 的 KV cache 反而能很好地节省 token,并且任务的工作持续性精度得到了提升。

由于 KV cache 的特性,通常只有前文完全相同的上下文才能使用 cache,所以我仅在模型的开头给短的系统提示,后续仅给出可用工具名称,并且在压缩上下文时避免压缩系统提示词部分,很好地利用了 KV cache。

关于工具的调用

工具的调用需要很多的安全检查,这里不做赘述。

以前我做 AI Agent 时,仅强制让模型通过 JSON 格式回复,以及每次告诉详细的工具调用细节,但是实践下来 AI 的工程能力极差。

现在发现,LLM 有专门的 tool calls 的 JSON 输出位置,可以直接利用 LLM 写好的规则直接调用。简单来说,只需要在整体对话的开头提及简单的工具名称和输入输出,一句话简洁描述,AI 就能很好地完成任务。

工具我一般分为三类,像 RAG、网络搜索等基础功能,我一般会设置手动开关,在用户输入时让模型能自动获取相关内容,而非多轮工具调用。

第二类为常用工具,例如模型手动查询 RAG,读写文件。这类工具的调用会直接写在开头的 instruction,用简要的工具介绍以及调用方法。仅在模型调用且失败时再给具体的细节以及失败报错,让 AI Agent 能很好地自我 debug。

第三类为不常用工具,通常我会仅写在 skill 里面,让模型遇到类似问题时手动或自动通过 RAG 或手动搜索读取到相关知识。

关于 States 的循环

我用 LangGraph 做的主要状态转移的相关工作。让模型在开始对话,结束任务,调用工具等状态转移。

以前我为了考虑各种情况,做了超级多的状态,甚至有一个第三方 LLM 检测,例如在需要调用工具时如果没有调用就结束了对话,则第三方模型阻止停止并告诉模型调用工具,但是事实上效果很糟糕,也是我早期模型一直失败的原因。

现在我简化了 States,简单来说,大致分为这几种情况:

  1. 首次开始对话:注入系统提示词等 -> 2
  2. 对话开始,注入用户问题,以及可能的 RAG 返回 -> 3
  3. 模型回复,如果确认可以停止 -> 4;如果需要调用工具,则在回复的同时调用工具,如果调用正确 -> 3;如果调用错误 -> 5
  4. 停止
  5. 调用工具出错,返回工具的具体调用方法以及报错原文
  6. 压缩系统提示词以外的上下文,可以手动触发以及在上下文过长时触发

关于 MCP

简单来说,MCP 类似给模型专用的 API,后端可以直接处理 API 的沟通,模型则可以和工具一样直接调用 MCP 的功能。

关于自动化

似乎很多 AI Agent 都有自动化的功能,按照一定的时间周期触发,但是大部分的 AI Agent 都写死了,例如每周、每月、每天。

事实上,可以通过触发后让 LLM 来自动设定下一次触发的时间,这样甚至能按照斐波那契间隔来自动触发。

关于修改 AI Agent 设置

对于安全的内容,可以通过 JSON 等格式来设定 AI Agent 的系统设置,然后让 AI Agent 通过修改文件的方式来自动更改设置,例如系统语言。

有趣的事

开发时,最好的辅助就是直接询问帮我 coding 的 Codex,直接询问它是如何做到各种操作的,然后模仿学习。