Python----大模型(Agent----编写一个简单的Agent)
摘要: React框架是构建智能代理(Agent)的核心逻辑,通过推理(Reasoning)与执行(Acting)的循环实现复杂任务处理。LLM负责推理分析,外部工具(如API)增强执行能力,Prompt设计是关键桥梁。工作流程包括输入接收、推理决策、工具调用、结果反馈及最终输出。示例代码展示了温度查询Agent的实现:定义工具函数(如get_current_temperature),配置工具系统
一、Agent
1.1、Agent的底层逻辑-React
React(Reasoning + Acting)是构建智能代理(Agent)的一个底层逻辑框架,用于 通过语言模型(LLM)结合外部工具的交互来解决复杂问题。它的核心思想是通过推 理(Reasoning)和执行(Acting)**的循环,让代理能够自主思考、规划和采取行动。
1.2、React框架的主要组成部分
Reasoning(推理): 代理首先通过LLM的推理能力,分析输入信息,理解上下文、问题或任务。 推理阶段产生的结果是代理对任务的理解,它可能是某个问题的下一步行动、调 用某个工具的决定或需要收集更多信息。
Acting(执行): 代理根据推理的结果,采取相应的行动。 行动的方式包括调用外部工具、与环境交互,或者对用户进行反馈。 行动完成后,结果会反馈给LLM,进入下一轮推理,形成循环。
1.3、React如何结合LLM和工具
LLM:负责执行复杂任务的核心推理部分。LLM能根据自然语言理解问题,推断 出潜在的需求或解决方案。
工具:LLM单独执行复杂任务可能能力有限,结合特定工具(如Python、浏览 器、API等)可以增强它的执行能力。例如,当任务涉及数据处理时,LLM可以推 断出需要调用某个工具,然后将请求交给工具执行。
Prompt(提示词):设计Prompt是让LLM和工具之间顺利交互的关键。通过巧 妙设计Prompt,能够使得LLM更准确地推理任务并选择合适的工具。
1.4、React的工作流程
接收输入:接收到用户的输入,比如问题、任务或指令。
推理与行动决策:
LLM根据输入进行推理,判断是否需要调用工具,或直接生成响应。 如果需要调用工具,代理会明确决定使用哪个工具,并形成明确的行动步骤。 执行工具:代理调用外部工具进行操作,执行特定任务,如数据查询、计算、图 像生成等。
反馈推理:
工具返回结果后,LLM会再次进行推理,基于新的信息更新推理结果 或采取下一步行动。
输出结果:
最终,经过若干轮的推理与执行后,代理生成最终的响应,并返回给 用户。
二、编写Agent
常量定义与工具函数
# ReAct提示词模板(指导模型如何思考和使用工具)
REACT_PROMPT = """请尽可能好地回答以下问题,如果需要,可以适当的使用一些功能。\n
你有以下工具可用:\n
{tool_descs} \n
请使用以下格式:\n
Question: 需要回答的问题。\n
Thought: 总是考虑应该做什么以及使用哪些工具。\n
Action: 应采取的行动,应为 [{tool_names}] 中的一个。\n
Action Input: 行动的输入。\n
Observation: 行动的结果。\n
... (这个Thought/Action/Action Input/Observation 过程可以重复零次或者多次)。\n
Thought: 我现在知道最终答案了。\n
Final Answer: 对原问题的最终答案。\n
开始! \n
"""
# 模拟API工具函数1:获取当前温度
def get_current_temperature(location: str):
return {"temperature": 26.1, "location": location}
# 模拟API工具函数2:获取历史温度
def get_temperature_date(location: str, date: str):
return {"temperature": 25.9, "location": location, "date": date}
工具系统配置
# 可用工具列表(名称、描述、参数规范)
TOOLS = [
{
"name": "get_current_temperature",
"description": "获取某个位置的当前温度。",
"parameters": {
"location": {
"type": "string",
"description": "要获取的温度的位置。格式为“城市”。"
}
}
},
{
"name": "get_temperature_date",
"description": "通过某个位置和日期获取温度。",
"parameters": {
"location": {
"type": "string",
"description": "要获取的温度的位置。格式为“城市”。"
},
"date": {
"type": "string",
"description": "要获取温度的日期。格式为“年-月-日”。"
}
}
}
]
# 工具描述模板(用于生成系统提示)
TOOL_DESC = "{name}:{description} 参数:{parameters}"
核心功能函数
def get_function_by_name(name: str):
"""工具名称到函数的映射"""
if name == "get_current_temperature":
return get_current_temperature
...
def build_sys_prompt(tools):
"""构建系统提示词(整合工具信息)"""
tool_descs = [TOOL_DESC.format(**tool) for tool in tools]
return REACT_PROMPT.format(
tool_descs="\n\n".join(tool_descs),
tool_names=", ".join([t["name"] for t in tools])
)
def parse(llm_outputs):
"""解析模型输出,提取Action和Input"""
actions = re.findall(r"Action:\s*(\S+)", llm_outputs)
inputs = re.findall(r"Action Input:\s*(\{.*?\})", llm_outputs)
return list(zip(actions, inputs)), ... # 返回行动列表和剩余文本
主执行流程
if __name__ == "__main__":
# 4.1 初始化组件
sys_prompt = build_sys_prompt(TOOLS)
chat_model = ChatOpenAI(
api_key='EMPTY',
base_url='http://127.0.0.1:10222/v1',
model="Qwen2.5-7B-Instruct"
)
# 4.2 构建对话消息
messages = [
{"role": "system", "content": sys_prompt},
{"role": "user", "content": "北京今天的天气怎么样?"}
]
# 4.3 获取模型初始响应
outputs = chat_model.invoke(messages).content
# 4.4 解析和执行工具
actions, remaining_text = parse(outputs)
observations = [get_function_by_name(act)(**json.loads(inp))
for act, inp in actions]
# 4.5 获取最终答案
messages.append({
"role": "assistant",
"content": remaining_text + "\nObservation: " + str(observations)
})
final_answer = chat_model.invoke(messages).content
print(final_answer.split("Final Answer:")[-1].strip())
今天北京的温度是26.1℃,而明天北京的温度预计为25.9℃。请注意,实际天气情况可能会有所不同,建议您关注最新的天气预报。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)