ReAct Agent(LangGraph实现)

文章目录

  • 参考资料
  • 一 AI Agent
  • 二 ReAct
  • 三 LangGraph实现ReAct代理
    • 3.1 SerperAPI实时联网搜索
    • 3.2 ReAct实现

参考资料

  • entic RAG 架构的基本原理与应用入门

一 AI Agent

  • AI Agent 整个过程是一个动态循环。Agent不断从环境中学习,通过其行动影响环境,然后根据环境的反馈继续调整其行动和策略。这种模式特别适用于那些需要理解和生成自然语言的应用场景,如聊天机器人、自动翻译系统或其他形式的自动化客户支持。
    在这里插入图片描述
    在这里插入图片描述
    一个人工智能代理的基本架构,包括它与环境的互动、感知输入、大脑处理及其决策过程。具体来说:
  1. 环境(Environment): AI代理接收来自其周围环境的信息。环境可以是一个网站、数据库或任何其他类型的系统。
  2. 感知(Perception): 即输入。AI代理通过多种方式感知环境,如视觉(图像)、听觉(声音)、文本(文字信息)和其他传感器输入(如位置、温度等)。这些输入帮助代理理解当前的环境状态。
  3. 大脑(Brain)
  • 存储(Storage)
    • 记忆(Memory):存储先前的经验和数据,类似于人类的记忆。
    • 知识(Knowledge):包括事实、信息和代理用于决策的程序。
  • 决策制定(Decision Making):总结(Summary)、回忆(Recall)、学习(Learn)、检索(Retrieve):这些功能帮助AI在需要时回顾和利用存储的知识。
    • 规划/推理(Planning/Reasoning):基于当前输入和存储的知识,制定行动计划。
  1. 行动(Action):代理基于其感知和决策过程产生响应或行动。这可以是物理动作、发送API请求、生成文本或其他形式的输出。

二 ReAct

  • ReAct 代理可以处理顺序的多部分查询,同时通过将路由、查询规划和工具使用组合到单个实体中来维护状态(在内存中)。通过交叉推理和行动,ReAct 使智能体能够动态地在产生想法和特定于任务的行动之间交替。
  • ReAct:Synergizing Reasoning and Acting in Language Models
  • ReAct 框架有两个过程,由 Reason 和 Act 结合而来。从本质上讲,这种方法的灵感来自于人类如何通过和谐地结合思维和行动来执行任务。
  • Reason基于一种推理技术——思想链(CoT)。 CoT是一种提示工程,通过将输入分解为多个逻辑思维步骤,帮助大语言模型执行推理并解决复杂问题。这使得大模型能够按顺序规划和解决任务的每个部分,从而更准确地获得最终结果。
    • 分解问题:当面对复杂的任务时,CoT 方法不是通过单个步骤解决它,而是将任务分解为更小的步骤,每个步骤解决不同方面的问题。
    • 顺序思维:思维链中的每一步都建立在上一步的结果之上。这样,模型就能从头到尾构造出一条逻辑推理链。
      在这里插入图片描述
  • 在 CoT 提示工程的限定下,大模型仍然会产生幻觉。因为经过长期的使用,大家发现在推理的中间阶段会产生不正确的答案或上下游的传播错误,所以,Google DeepMind 团队开发了ReAct的技术来弥补这一点。
  • ReAct 采用的是 思想-行动-观察循环的思路,其中代理根据先前的观察进行推理以决定行动。这个迭代过程使其能够根据其行动的结果来调整和完善其方法。
    在这里插入图片描述
  • Question指的是用户请求的任务或需要解决的问题。
  • Thought用来确定要采取的行动并向大模型展示如何创建/维护/调整行动计划。
  • Action Input是用来让大模型与外部环境(例如搜索引擎、维基百科)的实时交互,包括具有预定义范围的API。
  • Observation是会观察执行操作结果的输出,重复此过程直至任务完成。

三 LangGraph实现ReAct代理

3.1 SerperAPI实时联网搜索

  • Serper一个高性能的Google搜索APl,提供快速且成本效益高的方式访问Google搜索结果。在目前的应用落地产品中广泛被用于增强聊天机器人、进行搜索引擎优化(SEO)分析和简化金融科技项目等多种场景。该API具备:执行实时搜索、自定义查询位置、快速访问Google的搜索引擎结果等优势。
  • 新用户注册具有2500次免费搜索额度,可以在Playground中自定义搜索配置。
    在这里插入图片描述
  • 简单测试用例
import http.client
import jsonconn = http.client.HTTPSConnection("google.serper.dev")
payload = json.dumps({"q": "通义千问最新模型","gl": "cn","hl": "ny"
})
headers = {'X-API-KEY': 'xxx','Content-Type': 'application/json'
}
conn.request("POST", "/search", payload, headers)
res = conn.getresponse()
data = res.read()
#print(data.decode("utf-8"))
data=json.loads(data.decode("utf-8"))# 将返回的JSON字符串转换为字典

3.2 ReAct实现

  • OpenAI 中转API key平台
  • LLM Model使用gpt-4o
from typing import (Annotated,Sequence,TypedDict)
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
from langchain_core.tools import tool
from typing import Union, Optional
from pydantic import BaseModel, Field
import json
import http.clientclass AgentState(TypedDict):"""代理状态"""messages: Annotated[Sequence[BaseMessage], add_messages]class SearchQuery(BaseModel):"""SearchQuery 数据模型"""query: str = Field(description="Questions for networking queries")# 参数 args_schema=SearchQuery 表示使用 SearchQuery 模型来验证函数的输入参数
@tool(args_schema = SearchQuery)
def fetch_real_time_info(query):"""获取互联网实时信息工具函数"""conn = http.client.HTTPSConnection("google.serper.dev")payload = json.dumps({"q": query,"gl": "cn","hl": "ny"})headers = {'X-API-KEY': 'xxx','Content-Type': 'application/json'}conn.request("POST", "/search", payload, headers)res = conn.getresponse()data = res.read()#print(data.decode("utf-8"))data=json.loads(data.decode("utf-8"))# 将返回的JSON字符串转换为字典 if 'organic' in data:return json.dumps(data['organic'],  ensure_ascii=False)  # 返回'organic'部分的JSON字符串else:return json.dumps({"error": "No organic results found"},  ensure_ascii=False)  # 如果没有'organic'键,返回错误信息#fetch_real_time_info.invoke({"query":  "通义千问最新模型"})#----------------------------
import os
from langchain_openai import ChatOpenAI
api_key="hk-xxx"
base_url="https://api.openai-hk.com/v1"# 临时设置环境变量
os.environ["OPENAI_API_KEY"] = api_key
os.environ["OPENAI_BASE_URL"] = base_url
# 实例化模型
llm = ChatOpenAI(api_key=api_key,base_url=base_url,model="gpt-4o"
)# 绑定工具
tools = [fetch_real_time_info]
model = llm.bind_tools(tools) # ----------------------------
import json
from langchain_core.messages import ToolMessage, SystemMessage, HumanMessage
from langchain_core.runnables import RunnableConfigtools_by_name = {tool.name: tool for tool in tools}# 定义工具节点
def tool_node(state: AgentState):outputs = []for tool_call in state["messages"][-1].tool_calls:tool_result = tools_by_name[tool_call["name"]].invoke(tool_call["args"])outputs.append(ToolMessage(content=json.dumps(tool_result),name=tool_call["name"],tool_call_id=tool_call["id"],))return {"messages": outputs}# 定义问答模型
def call_model(state: AgentState,):system_prompt = SystemMessage("你是一个智能助手,请尽全力回答用户的问题")response = model.invoke([system_prompt] + state["messages"])return {"messages": [response]}# 定义路由节点
def should_continue(state: AgentState):messages = state["messages"]last_message = messages[-1]if not last_message.tool_calls:return "end"else:return "continue"# -----------------------------------
from langgraph.graph import StateGraph, END
from IPython.display import Image, display
# 定义一个图结构
workflow = StateGraph(AgentState)# 在图结构中添加节点
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)# 设置启动点是 agent
workflow.set_entry_point("agent")# 添加路由边
workflow.add_conditional_edges("agent",should_continue,{"continue": "tools","end": END,},
)
# 添加返回边
workflow.add_edge("tools", "agent")
# 编译图
graph = workflow.compile()
display(Image(graph.get_graph().draw_mermaid_png()))# 打印问答的流 
def print_stream(stream):"""打印消息流的工具函数,支持两种消息格式:1. 元组(tuple)形式的原始消息 2. 具有 pretty_print() 方法的对象 参数:stream: 可迭代的消息流,每个元素应包含 "messages" 列表 """for s in stream:  # 遍历消息流中的每个元素message = s["messages"][-1]  # 获取当前元素中 messages 列表的最后一个消息 if isinstance(message, tuple):  # 如果消息是元组类型print(message)  # 直接打印原始元组 else:  # 其他情况message.pretty_print()   # 调用对象的格式化打印方法 inputs = {"messages": [("user", "如何看待通义千问最新模型?")]}
print_stream(graph.stream(inputs, stream_mode="values"))

在这里插入图片描述

================================ Human Message =================================

如何看待通义千问最新模型?
================================== Ai Message ==================================
Tool Calls:
fetch_real_time_info (call_b85QNErx5VwN3KXtaDTQQbbe)
Call ID: call_b85QNErx5VwN3KXtaDTQQbbe
Args:
query: 通义千问最新模型 发布
================================= Tool Message =================================
Name: fetch_real_time_info

“[{xxx}]”
================================== Ai Message ==================================

对于阿里巴巴云最新发布的通义千问模型(Qwen3),这次更新带来了许多重要的变化和提升。以下是一些关键点:

  1. 版本升级: 通义千问的Qwen3版本及其子系列已经得到了显著提升。最新的Qwen3-Coder系列具有卓越的代码生成能力,被认为在开源模型中达到SOTA(State Of The Art)效果。

  2. 强化的核心: Qwen3系列核心的235B旗舰版本进行了同步重磅升级,其模型的通用能力显著领先于之前的版本。这表明模型在处理复杂任务时能够更高效地应对并提供更精确的结果。

  3. 多模态支持: 在不同应用场合的适应能力上,Qwen3还推出了加强互动环境的能力,使其在工具调优和环境交互中表现优异,使用户能够实现更加自主的任务操作。

更多详细信息可以访问阿里云官网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93034.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何从0到1的建立组织级项目管理体系【现状诊断】

今天我想给大家分享是“如何在企业中从0到1的去建立PMO的组织级项目管理体系。”的系列文章,这是我近几年来一直在努力的尝试去探索和实践的过程,从0到1的过程。当我最开始去接手这样一个场景的时候所需要做的第一件事情是诊断和差距分析。这是多年以来做…

网络通信协议详解:TCP协议 vs HTTP协议

在计算机网络中,TCP(传输控制协议)和HTTP(超文本传输协议)是两个核心协议,但它们的职责和层级完全不同。TCP是底层传输协议,负责数据的可靠传输;HTTP是应用层协议,定义了…

[Qt]QString隐式拷贝

引言在Qt框架中,QString 作为字符串处理的核心类,其高效的内存管理机制一直是开发者津津乐道的特性。这背后的关键便是 隐式共享(Implicit Sharing),也称为 写时复制(Copy-On-Write, COW)。本文…

命令行创建 UV 环境及本地化实战演示—— 基于《Python 多版本与开发环境治理架构设计》的最佳实践

命令行创建 UV 环境及本地化实战:基于架构设计的最佳实践 Python 多版本环境治理理念驱动的系统架构设计:三维治理、四级隔离、五项自治 原则-CSDN博客 使用 Conda 工具链创建 UV 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》-CS…

跨域问题全解:从原理到实战

在计算机网络中,跨域(Cross-Origin) 指的是浏览器出于安全考虑,限制网页脚本(如 JavaScript)向与当前页面不同源(Origin) 的服务器发起请求的行为。这是由浏览器的同源策略&#xff…

(46)elasticsearch-华为云CCE无状态负载部署

一、准备好elasticsearch镜像并提前上传到镜像仓库 此次准备的是elasticsearch:v7.10.2 二、开始部署 负载名称:es-deployment 注意:内部配额太低会造成多次重启 环境变量: #单节点启动(实例pod可以多增加几个) discovery.type single-node 三、添加svc 四、注意:…

HCLP--MGER综合实验

一、拓扑图二、需求1、R5为ISP,只能进行IP地址配置,其所有地址均配为公有I地址; 2、R1和R5间使用PPP的PAP认证,R5为主认证方, R2与R5之间使用ppp的CHAP认证,R5为主认证方; R3与R5之间使用HDLc封装; 3、R1、R2、R3构建一…

idea中无法删除模块,只能remove?

1.先对module右键想要删除的module,选择remove module(这是idea为了避免误操作) 2.在remove module后,模块并未从项目结构中删除(磁盘中也依旧存在),但再次右击你会发现,出现了del…

青藤天睿RASP再次发威!捕获E签宝RCE 0day漏洞

在2025年HVV关键攻防节点上,攻击队对E签宝电子合同服务发起的0day攻击被青藤天睿RASP截获。该漏洞可使攻击者在未授权情况下实现服务器远程代码执行(RCE),进而控制服务器,构成横向渗透的关键跳板。>>>>漏洞…

Lua(字符串)

Lua字符串基础Lua中的字符串是不可变序列,可以包含任意字节数据(包括嵌入的\0)。字符串可以用单引号、双引号或长括号([[ ]])定义:str1 "Hello" str2 World str3 [[Multi-line string]]字符串…

大模型蒸馏(distillation)---从DeepseekR1-1.5B到Qwen-2.5-1.5B蒸馏

目录 1.1 蒸馏目标 2 环境准备 2.1依赖库安装 2.2 硬件要求 2.3 模型与数据集下载 2.3.1 教师模型下载 2.3.2 学生模型下载 2.3.3 数据集准备或下载 3.过程日志 4. 模型加载与配置 4.1 加载教师模型 4.2 加载学生模型 4.3 数据预处理函数 4.4 数据收集器 4.5 定义…

通过redis_exporter监控redis cluster

环境说明: 现在有一套redis cluster,部署是3主机6实例架构部署。需要采集对应的指标,满足异常监控告警,性能分析所需。 环境准备 以下环境需要提前部署完成。 redis cluser prometheus alertmanager grafna redis_exporter部署 我…

第二十天(正则表达式与功能实际运用)

在程序员一生的工作中,遇到的最多的数据就是字符串字符串里面很有可能有很多的不需要的信息我们需要从中间挑选出我们需要的如果循环去写,比较简单的时候问题不大规则多了,你的工作量会成倍上升的为了解决这个问题 ---- 正则表达式正则表达式…

0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)

1.如何区分书证和电子数据 书面材料是否为书证?→ 看内容是否直接源于案件事实(不是 “记录别人陈述” 的载体)。 证据清单是否为证据?→ 看谁做的清单(侦查人员做的勘查笔录是证据,当事人做的目录不是&…

资产负债表及其数据获取

文章目录资产负债表及其数据获取资产负债表资产负债表在股票投资中的意义AKShare中的资产负债表数据接口(深沪为例)接口描述调用示例总结资产负债表及其数据获取 资产负债表 资产负债表(Balance Sheet)是反映企业在某一特定日期财…

数据仓库深度探索系列 | 开篇:开启数仓建设新征程

数据仓库深度探索系列 | 开篇:开启数仓建设新征程 在当今信息技术飞速发展的背景下,企业面临着数据量的爆炸式增长。企业不仅要高效管理海量数据,还需从中提取关键信息以支持复杂决策。数据仓库已从单纯的数据存储工具,演变为支持…

Linux如何执行系统调用及高效执行系统调用:深入浅出的解析

文章目录如何执行系统调用及高效执行系统调用:深入浅出的解析一、什么是系统调用?1.1 系统调用的作用1.2 系统调用的分类二、如何执行系统调用?2.1 系统调用的触发2.2 库函数与系统调用的关系2.3 系统调用的示例2.4 错误处理三、如何高效执行…

基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(上)

摘要 随着信息技术的飞速发展和医疗健康数据的爆炸式增长,现代医疗机构面临着日益复杂的数据处理挑战。医生和行政人员常常需要花费大量时间在数据提取、整理、分析和报告生成等重复性、事务性的工作上,这不仅降低了工作效率,也限制了医护人员将更多精力投入到直接的患者护…

基于Kafka实现简单的延时队列

生命无罪,健康万岁,我是laity。 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它在空虚时,用爱欲来填充; 第三次,在困难和容易之间&…

OceanBase 4.3.5 解析:DDL性能诊断

背景DDL操作通常耗时较长,特别是涉及补数据流程的DDL语句。在执行过程中,用户面临两个主要痛点:一是无法实时获取DDL执行进度,难以区分长时间运行是正常现象还是由内部异常导致的停滞;二是执行效率经常低于预期&#x…