大数跨境
0
0

AI Agent开发实战:精细的prompt + memory管理 + 好用tools = 强大的Agent

AI Agent开发实战:精细的prompt + memory管理 + 好用tools = 强大的Agent InfraLink
2025-11-26
0
导读:从"聊天机器人"到"智能助手"的进化说起AI Agent,很多人第一反应可能是"不就是个聊天机器人吗?"。但

从"聊天机器人"到"智能助手"的进化

说起AI Agent,很多人第一反应可能是"不就是个聊天机器人吗?"。但经过几个月的实际开发,我发现这两者的差别就像"客服"和"助理"的区别一样大。

传统聊天机器人:

  • 你问一句,它答一句
  • 没有记忆,每次都是"初次见面"
  • 只能"动嘴",不能"动手"

而真正的AI Agent:

  • 能记住你之前说过什么
  • 会主动思考下一步该做什么
  • 可以调用各种工具帮你干活

就像雇了个靠谱的助理,你只需要说"帮我分析一下这个月的销售数据",它就能自己去找文件、跑数据、做图表,最后给你一个完整的分析报告。

当然市面上有很多好用的框架帮你实现工具调用,以及Agent的搭建,但是不手动实现一个总感觉认知不够清晰,我借助AI Code 做了一个Toy项目:

https://github.com/wp931120/code_agent。

没有借助任何框架,function call工具调用直接采用 代码解析出来,并执行。方便大家学习理解Agent的底层逻辑,下方是AI Agent的demo。


当然目前这个Agent没有先计划在执行,而是先思考在执行,走一步看一步的模式实现, 后续打算研究一下进行先任务规划后执行的agent。

实现过程中,我总结出一个简单粗暴的公式:智能Agent = 好的prompt + memory管理 + 好用tools。今天就来聊聊这个公式背后的"坑"和"经验"。

精细的prompt:Agent的"大脑"设计

传统prompt vs Agent prompt:从"口头通知"到"员工手册"

以前写prompt就像口头交代任务:你是一个编程助手,请帮我写代码。

结果AI经常"理解偏差",要么答非所问,要么做过头了。

现在写Agent的prompt就像给新员工写详细的工作手册,恨不得把每个细节都写清楚:

# 我们项目中的系统prompt片段
SYSTEM_PROMPT = """
你是一个强大的AI编程助手,能够通过系统化推理和工具使用来解决复杂问题。

## 核心原则
- **始终记住用户的原始任务**:在每次行动前,回顾用户最初提出的具体需求
- **明确任务完成标准**:当用户的原始需求已经完全满足时,必须立即使用final_answer结束任务
- **避免无限循环**:不要重复执行已经完成的操作或创建不必要的额外功能

## 重要规则
- 你必须使用工具来回答用户的问题,不能直接回答
- 每个回合都必须调用一个工具
- **关键**:当用户的原始任务已经完成时,必须立即使用final_answer工具结束
"
""

思考机制(COT):让AI学会"三思而后行"

刚开始做Agent的时候,经常遇到AI"乱搞"的情况:明明只是想读个文件,它却开始执行代码;明明任务已经完成了,它还在那里"优化"个没完。

后来发现,关键是要让AI学会"三思而后行"。就像我们做事之前会在心里盘算一下一样,AI也需要先"想想"再行动:

# 良好的Thought示例
"""Thought:用户需要分析CSV数据,我需要使用read_file工具读取文件内容,
以便了解数据结构和内容,为后续的数据处理做准备"""


# 而不是简单的
"""Thought:我需要使用工具"""

这种设计让Agent的行为更加可预测和可控,避免了盲目的工具调用。

任务完成机制:治好AI的"强迫症"

有没有遇到过这种情况:你让AI帮你写个简单的HTML页面,结果它给你写完了还要加CSS美化,加完CSS还要加JavaScript交互,加完JavaScript还要考虑响应式设计...

这就是AI的"强迫症",总觉得还能再优化一下。解决办法就是在prompt里明确告诉它什么时候该"收手":

## 任务完成标准
- 用户明确提出的需求已经实现
- 创建的文件或代码能够满足用户的具体要求
- 不需要添加用户未要求的额外功能或优化
- **重要**:完成核心任务后立即停止,使用final_answer总结完成情况

Memory管理:给AI装个"好使的脑子"

对话记忆的设计:不只是"聊天记录"

很多人以为Agent的记忆就是把聊天记录存起来,其实远没那么简单。就像人的大脑一样,很容易忘记任务, 添加任务提醒到记忆中能够帮助。

# 添加任务提醒到记忆中
observation_with_reminder = f"提醒:你的原始任务是:{self.original_task}。请检查是否已完成此任务,如果已完成请使用final_answer结束。"
self.memory.append({"role""user""content": observation_with_reminder})

这种设计确保Agent在执行多步骤任务时不会"跑偏"。而且记忆超长后LLM的能力会变弱。 需要对Agent的记忆进行压缩,我这里没有做过多的实现。

好用Tools:给AI配齐"十八般武艺"

工具的标准化设计:统一的"接口规范"

刚开始写工具的时候,我就像个"野路子"程序员,每个工具的接口都不一样,结果AI经常调用出错。后来学乖了,给所有工具定义统一的"接口规范":

class ToolDefinition:
    """工具定义的标准化结构"""
    def __init__(self, name: str, description: str, required_params: list, optional_params: dict = None):
        self.name = name
        self.description = description
        self.required_params = required_params
        self.optional_params = optional_params or {}
    
    def to_prompt_format(self):
        """生成稳定的prompt格式"""
        lines = [f"- **{self.name}**: {self.description}"]
        
        if self.required_params:
            lines.append("  必需参数:")
            for param in self.required_params:
                lines.append(f"    - {param}{self.all_params.get(param)}")
        
        return"\n".join(lines)

工具的一致性验证

我们实现了工具定义的一致性检查,确保系统启动时所有工具都是可用的:

def validate_tools_consistency() -> tuple[bool, str]:
    """验证工具定义的一致性"""
    try:
        # 检查工具定义是否完整
        for tool_name, tool_def in TOOLS.items():
            if not all(key in tool_def for key in ["description""required_parameters"]):
                return Falsef"工具 {tool_name} 定义不完整"
        
        return Truef"所有 {len(TOOLS)} 个工具定义验证通过"
    except Exception as e:
        return Falsef"工具验证过程中出错: {str(e)}"

专业化工具的设计

我们发现,与其提供通用的工具,不如提供专业化的工具。比如数据可视化,我们专门设计了ECharts工具:

def create_echarts_visualization(data, chart_type: str, output_filename: str, 
                                title: str = "", theme: str = "light")
 -> str:

    """根据输入数据和图表类型快速创建ECharts可视化HTML文件"""
    try:
        # 数据处理
        processed_data = _process_chart_data(data, chart_type)
        
        # 图表配置生成
        chart_option = _generate_chart_config(chart_type, processed_data, title, """")
        
        # HTML模板生成
        html_content = _generate_html_template(chart_option, title, chart_type, theme)
        
        # 保存文件
        file_path = get_workspace_path(output_filename)
        with open(file_path, 'w', encoding='utf-8'as f:
            f.write(html_content)
        
        returnf"ECharts {chart_type} 图表已生成并保存为 {output_filename}"
    except Exception as e:
        returnf"创建图表时出错: {str(e)}"

这种专业化的工具设计让Agent能够高效地完成特定领域的任务。其实就是Cluade Code 不同层次工具的定义思想。

实战案例:三者的完美配合

让我们看一个实际的例子,用户要求"分析员工工资数据并生成可视化图表":

Prompt引导思考

Thought:用户需要分析员工工资数据。我需要先使用read_file工具读取数据文件,
了解数据结构,然后使用execute_code进行数据分析,最后用create_echarts_visualization
创建可视化图表。

Memory保持上下文

# 系统自动添加任务提醒
"提醒:你的原始任务是:分析员工工资数据并生成可视化图表。
请检查是否已完成此任务,如果已完成请使用final_answer结束。"

Tools执行具体操作

# 1. 读取数据
Action: {"name""read_file""arguments": {"file_path""员工信息表.csv"}}

# 2. 分析数据
Action: {"name""execute_code""arguments": {"code""import pandas as pd..."}}

# 3. 生成图表
Action: {"name""create_echarts_visualization"
         "arguments": {"data": salary_data, "chart_type""bar""title""员工工资分析"}}

# 4. 完成任务
Action: {"name""final_answer"
         "arguments": {"answer""员工工资数据分析完成,已生成可视化图表"}}

踩过的坑和血泪教训

Prompt设计的坑:说话要"人话"

坑1:指令模糊,AI瞎猜

刚开始我经常这样写prompt:

  • ❌ "帮我处理数据"

结果AI一脸懵逼:处理啥数据?怎么处理?处理成啥样?

后来学会了"保姆式"指令:

  • ✅ "使用pandas读取workspace目录下的员工信息表.csv,计算各部门平均工资,并生成柱状图保存为salary_chart.html"

坑2:没有"刹车",AI停不下来

有一次让AI写个简单的计算器,结果它写完基础功能后,又加了科学计算,又加了历史记录,它还在那里"优化"。

解决办法:给AI装个"刹车"系统,明确告诉它什么时候该停。

Tools设计的坑:工具也要"好用"

坑1:工具粒度像"拆盲盒",可以参考claude code的工具设计逻辑,不同粒度都要有

最开始我设计工具特别"原子化":

  • open_file() - 打开文件
  • read_line() - 读一行
  • close_file() - 关闭文件

结果AI读个文件要调用20多次工具,效率低得要命。

后来改成:

  • read_file(file_path) - 一步到位读取整个文件

未来展望:Agent开发的趋势

1 从目前的发展趋势来看,AI Agent正在成为新的应用开发范式。未来可能的发展方向包括:

  1. 多Agent协作:不同专业领域的Agent相互配合
  2. 更智能的记忆管理:基于重要性的动态记忆压缩
  3. 自适应工具学习:Agent能够学习和创建新工具
  4. 更好的人机协作界面:让普通用户也能轻松使用Agent

结语:从"能用"到"好用"的关键

写了这么多,其实想说的就一句话:做AI Agent不是比谁用的模型更牛逼,而是比谁更懂得"调教"AI

就像养宠物一样:

  • 好的prompt = 耐心的指导,告诉它什么该做什么不该做
  • 合理的memory管理 = 合适的提醒和忘记,既要记住重要的事,也不能让太长太大
  • 实用的tools设计 = 给它配齐趁手的工具,让它能真正帮到你

这三样缺一不可,就像三条腿的凳子,少了哪条都坐不稳。

最后想说,AI Agent这个领域还很新,大家都在摸着石头过河。我分享的这些经验也不一定都对,但至少是真实踩过的坑。希望能帮到正在路上的朋友们,少走点弯路。

如果你也在折腾AI Agent,欢迎来聊聊,一起踩坑一起成长!

本文基于真实项目开发经验总结,代码已开源在GitHub:https://github.com/wp931120/code_agent

  


关注我们!与InfraLink共赴智能未来



🔗 聚焦数据科学 | 深耕算法创新 | 赋能AI工程化

📌 技术干货持续更新,全球生态合作共建

✨ 点击关注@InfraLink,解锁更多前沿技术资讯与实践洞察


参考:

https://cc.deeptoai.com/docs/zh/advanced/decoding-claude-code-analysis 

【声明】内容源于网络
0
0
InfraLink
链接技术基建,共筑智能未来。 在数据智能重塑产业格局的时代,InfraLink 以「构建技术基础设施的全球连接枢纽」为使命,聚焦 数据科学、算法创新、AI 工程化 三大核心领域,打造集技术资讯、实践经验、生态合作为一体的全球化社区平台。
内容 109
粉丝 0
InfraLink 链接技术基建,共筑智能未来。 在数据智能重塑产业格局的时代,InfraLink 以「构建技术基础设施的全球连接枢纽」为使命,聚焦 数据科学、算法创新、AI 工程化 三大核心领域,打造集技术资讯、实践经验、生态合作为一体的全球化社区平台。
总阅读26
粉丝0
内容109