955 字
5 分钟

Agent应用框架

一、Agent应用架构深度解析#

下面有两个Agent的方案,请对比一下,哪个方案更好?

方案一:

graph LR 规划--> 行动1 --> 行动2 --> 结束

方案二:

graph LR 思考1--> 行动1 --> 思考2 --> 行动2 --> 结束

方案二比方案一好,因为思考2可以判断行动1的执行效果是否达成目的,达成目的时继续下一个行动,否则需要修改行动1并重新执行。

Agent应用架构#

graph LR 规划--> 思考; 行动 --> 思考; 思考-->行动; 思考-->结束;

运行机制:

graph LR Thought--> Observation; Observation-->Action; Action-->Thought;

Though:决定下一步要做的动作并给出理由

Action:执行下一步动作

Observation:观察执行动作结果的观察,用于反馈思考

React:智能体感知环境变化做出相应调整的机制

graph LR subgraph Tools Calendar Calculator CodeInterpreter Search ...more end A[Tools] -->Calendar; A -->Calculator; A -->CodeInterpreter; A -->Search; A -->...more; subgraph Memory C[Short-term memory] D[Long-term memory] end E[大模型]-->A E --> B[Memory] E --> F[Action]; B-->C B-->D E --> G[Planning]; G --> H[Reflection]; G --> I[Self-critics]; G --> J[Chain of thoughts]; G --> K[Subgoal decomposition]; A-.->F B-.->G B-.->H

Tools:工具库#

Memory:记忆

Action:行动

Planning:规划#

  • 理解任务,给出完成任务的具体步骤
  • 反思和优化,下一步行动的一个推理

规划阶段的关键技术:

  • Chain-of-Thought Prompting(COT)

    通过Prompt激发大模型的潜能,引导LLM做出更好的规划。

    例子:

    Q:我有5个羽毛球。我买了2罐羽毛球,一罐3个。我现在有多少个羽毛球?

    GPT-4o:你原本有 5 个羽毛球,买了 2 瓶,每瓶 3 个。所以,你现在总共有:

    5 + 2 × 3 = 5 + 6 = 11 个羽毛球。

  • 反思和细化

  • 记忆增强

    记忆增强通常有两种方法,RAG和微调。目的是注入背景知识,让模型能更好地完成任务。

    1. RAG的核心技术有:
    • 数据工程:收集数据,需要确保数据高质量
    • 数据切分:切分数据,切分的每个chunk尽量高质量
    • 一阶段检索:语义检索,尽可能多的找知识
    • 二阶段精排:重排序,返回高质量的数据
    • 用户意图识别:理解用户意图
    • 效果评估

Action:行动#

  • 语言模型通过推理触发
  • 执行器调用工具执行
graph LR 工具库-->|注册| LLM --> |触发|执行器

函数调用执行全过程:

agent.png

1.定义函数#

编写函数,在注释说明该函数的功能、需要的参数、返回的数据。

def add(num1,num2):
"""
该函数计算两个数字的和
:param num1: 必要参数,表示需要计算的第一个数字
:param num2: 必要参数,表示需要计算的第二个数字
:return: add函数计算后的结果,返回结果为float对象
"""
return float(num1+num2)

注册函数

add_tool={
"type":"function",
"function":{
"name":"add",
"description":"用于执行add算法函数,定义了一种将两个数字加起来的计算过程",
"parameters":{"type":"object","parameters":{"num1":{"type":"float","description":"需要计算的第一个数字"},"num2":{"type":"float","description":"需要计算的第二个数字"}},"required":["num1","num2"]}
}
}
tools=[add_tool]

2.函数描述和模型调用(第一次)#

模型去匹配对应的函数并调用。

response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
tools=tools,
tool_choice="auto",
)
response.choices[0].message

回复的内容如下:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_OqKaG4mk8Z5oEVKCYsd5rSCO', function=Function(arguments='{"num1":"1","num2":"2"}', name='add_tool'), type='function')])

这里的id是唯一的,用于匹配询问与回复。

3.解析模型返回数据并完成函数调用#

tool_calls = response.choices[0].message.tool_calls
for tool_call in tool_calls:
function_name = tool_call.function.name
function_to_call = available_tools[function_name]
function_args = json.loads(tool_call.function.arguments)
function_response = function_to_call(**function_args)
print(function_name)
print(function_args)
print(function_response)

输出为:

add_tool
{'num1':'1','num2':'2'}
"3"

4.结果增强模型生成(第二次)#

将函数调用的结果添加到消息中,增强模型生成。

messages.append(
{
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response,
}
)

Observation#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Agent应用框架
https://blog.micar9.com/posts/agent/
作者
bluish
发布于
2025-01-11
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-01-11,距今已过 395 天

部分内容可能已过时

目录