LangGraph框架中怎样定义工具tools

基本信息

  • LangGraph创建工具的几种方法及工具的使用
  • 模型调用通义千问(阿里Tongyi大模型)

定义简单工具

工具是一种封装函数及其输入模式的方法,可以将其传递给支持工具调用的聊天模型。这使得模型能够通过特定的输入请求执行该函数。

三种定义工具的方法

  1. 定义简单一个工具函数:可以将原始函数传递给create_react_agent来使用,自动将原始函数转换为LangChain工具。
  2. 自定义工具:为了更好地控制工具行为,请使用@tool装饰器,自动将原始函数转换为LangChain 工具。
  3. Pydantic 定义:可以使用 Pydantic 自定义输入模式

运行示例

# # -*- coding: utf-8 -*-
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi #dashscope 
from pydantic import BaseModel, Field
from langchain_core.tools import tool

#模型初始化
llm = ChatTongyi(
    model="qwen-turbo",#qwen-max-latest qwen-plus
    temperature=0,
    verbose=True,
    )

# 可以将原始函数传递给create_react_agent工具来使用,自动将原始函数转换为LangChain工具。
#定义简单一个工具函数
def addition(a: int, b: int) -> int:
    """两数相加"""
    return a + b

# 为了更好地控制工具行为,请使用@tool装饰器,自动将原始函数转换为LangChain 工具。
# 自定义工具
@tool("subtract_tool", parse_docstring=True)# parse_docstring=True表示会解析函数的文档字符串以提取信息
def subtraction(a: int, b: int) -> int:
    """
    计算两个整数的差。

    Args:
        a (int): 第一个整数。
        b (int): 第二个整数。

    Returns:
        int: 两个整数的差。
    """
    return a - b


# 可以使用 Pydantic 定义自定义输入模式:
class MultiplyInputSchema(BaseModel):
    """两数相乘"""
    a: int = Field(description="第一个数")
    b: int = Field(description="第二个数")

@tool("multiply_tool", args_schema=MultiplyInputSchema)
def multiply(a: int, b: int) -> int:
   return a * b


#构建一个智能体
agent = create_react_agent(
    model=llm,
    tools=[addition,subtraction,multiply],
)

response = agent.invoke(
    {
   
   "messages": [{
   
   "role": "user", "content": "2+4和7-1和2*3分别是多少?"}]}
)
print(response["messages"][-1].content)
#运行结果 2+4的结果是6,7-1的结果是6,2*3的结果也是6。

运行结果截图

在这里插入图片描述

隐藏模型中的参数

一些工具需要仅在运行时使用参数(例如,用户id或会话上下文),而这些参数不应受模型控制,同时保护用户隐私。
可以将这些参数放入agent的state状态或config配置中,并在工具内部访问这些信息:

基于大模型智能体Agent的LangGraph入门与实战课程目标:本课程旨在为LangGraph的初学者提供深入的理论知识和实践技能,使其能够独立构建和部署基于LangGraph的应用程序。课程形式:理论讲解 + 实战演练第1课 LangGraph基础架构与环境配置-LangGraph的概念解析第2课 LangGraph基础架构与环境配置-LangGraph的环境搭建与依赖管理第3课 LangGraph的基础原理与应用入门-构建基本聊天机器人及使用工具增强第4课 LangGraph的基础原理与应用入门-内存管理、人在回路、状态更新第5课 LangGraph高级图控制技术-并行节点扇出和扇入、增加额外步骤、条件分支第6课 LangGraph高级图控制技术-稳定排序、Map-Reduce并行执行、图递归控制第7课 LangGraph持久化机制与状态管理-线程级持久化、子图持久化、跨线程持久化第8课 LangGraph Human-in-the-loop-断点设置、动态设置断点、编辑更新状态第9课 LangGraph Human-in-the-loop-等待用户输入、时间旅行、工具评审第10课 LangGraph在具有长期记忆的有状态Agent中的应用-长期记忆及短期记忆、过滤信息、删掉信息第11课 LangGraph在具有长期记忆的有状态Agent中的应用-摘要总结、跨线程持久化、代理语义搜索第12课 LangGraph工具集成与调用-直接调用ToolNode、大模型使用工具第13课 LangGraph工具集成与调用-工具调用报错处理、运行时值传递给工具、注入参数第14课 LangGraph工具集成与调用-配置传入工具、从工具更新图状态、管理大量工具第15课 LangGraph子图设计与实现-添加及使用子图、父图及子图状态管理第16课 LangGraph子图设计与实现-子图状态的查看与更新、子图输入输出的转换与处理第17课 LangGraph项目实战演练-多智能体系统主管委托各个代理第18课 LangGraph课程复习与答疑 自我反思案例及论文案例讲解
目前在 Java 生态中,并没有一个官方或广泛认可的 **"LangGraph" 框架**,如同 Python 中由 LangChain 团队推出的 [LangGraph](https://github.com/langchain-ai/langgraph)(用于构建基于 LLM 的状态化、图结构代理应用)那样成熟和流行。 不过,在 Java 领域中有一些与 **LangGraph 功能相近**(虽然不完全等同)的框架或项目,它们支持: - 构建基于大语言模型(LLM)的状态机; - 使用图结构定义 Agent 的行为流程; - 支持可中断、恢复、多步骤流程; - 与 Spring Boot 等生态集成。 --- ## 🚀 目前 Java 中最接近 LangGraph 的实现框架 ### ✅ 1. **Spring AI** > 官网:[https://spring.io/projects/spring-ai](https://spring.io/projects/spring-ai) - 是 Spring 官方推出的 AI 开发框架。 - 支持与 OpenAI、Anthropic、Google Vertex AI 等模型对接。 - 提供了 `PromptTemplate`、`FunctionCalling`、`ChatClient` 等基础组件。 - 虽然目前尚未内置完整的“图式流程引擎”,但其模块化设计非常适合构建类似 LangGraph 的逻辑。 #### 示例代码片段: ```java @Bean public ChatClient chatClient() { return new OpenAiChatClient(OpenAiApi.fromOptions()); } @Bean public FunctionRegistry functionRegistry(ChatClient chatClient) { return FunctionRegistry.builder() .add("search", SearchTool::search) .chatClient(chatClient) .build(); } ``` 你可以结合 Spring State Machine 实现流程控制,模拟 LangGraph 的效果。 --- ### ✅ 2. **Spring State Machine** > 官网:[https://projects.spring.io/spring-statemachine/](https://projects.spring.io/spring-statemachine/) - 提供有限状态机(FSM)的能力。 - 可以用于构建状态化的 Agent 流程。 - 支持持久化、事件驱动、嵌套状态等高级特性。 #### 应用场景: - 构建多轮对话代理; - 控制流程节点跳转; - 结合 LLM 决策下一步动作。 #### 示例状态转移: ```java @Configuration @EnableStateMachine public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> { @Override public void configure(StateMachineStateModelConfigurer<States, Events> model) throws Exception { model .withModel() .factory(stateMachineModelFactory()); } @Override public void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception { transitions .withExternal() .source(States.INIT).target(States.WAITING_FOR_INPUT) .event(Events.USER_INPUT) .and() .withExternal() .source(States.WAITING_FOR_INPUT).target(States.PROCESSING) .event(Events.PROCESS); } } ``` --- ### ✅ 3. **LangChain4j** > GitHub:[https://github.com/langchain4j/langchain4j](https://github.com/langchain4j/langchain4j) - Java 社区发起的 LangChain 实现。 - 支持多种 LLM 接口封装。 - 提供 Chain、Agent、Memory、Tools 等核心概念。 - 当前暂未提供图形化流程编排能力,但可通过组合函数 + 状态管理模拟 LangGraph。 --- ## 🔍 总结对比表 | 框架 | 是否支持图结构流程 | 是否支持状态管理 | 是否支持 LLM | 是否活跃维护 | |------|------------------|------------------|---------------|----------------| | **Spring AI** | ❌(需自行扩展) | ✅(结合其他库) | ✅ | ✅ | | **Spring State Machine** | ✅ | ✅ | ❌(需集成) | ✅ | | **LangChain4j** | ❌(实验性) | ❌ | ✅ | ✅ | --- ## 🧠 如果你想实现 LangGraph 式功能(Java) 可以采用如下组合方案: ```java +-------------------+ | LLM Client | <---> LangChain4j / Spring AI +-------------------+ | v +-------------------+ | Function Tools | <---> 自定义工具类 +-------------------+ | v +-------------------+ | State Machine | <---> Spring State Machine +-------------------+ | v +-------------------+ | Graph Builder | <---> 自定义 DSL 或 JSON 描述 +-------------------+ ``` --- ## ✅ 小结 虽然目前 Java 没有官方发布的 **LangGraph 框架名称**,但你可以通过以下方式构建类似功能: - 使用 **LangChain4j** 做 LLM 接入; - 使用 **Spring State Machine** 构建状态流程; - 使用自定义 **DSL 或 JSON 配置**描述图结构; - 使用 **Spring AI** 提供标准化接口支持; ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小何慢行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值