一文掌握Langchain自定义工具调用的所有方式

在这里插入图片描述

LangChain自定义工具的方式有三种,我发现网上的人都是copy官网的教学,很难以理解,所以自己整理了一份简单带注释的python代码,相信你自己运行一遍之后,就明白各自的使用规则了。

  1. @tool装饰器 - 最简单的方式
  2. Tool类 - 适合包装现有函数
  3. StructuredTool - 最强大和灵活的方式

内容参考来自于Langchain官网

完整示例代码如下,注释解释得非常详细了,就不再文字赘述。完整代码是可以直接执行的哦,建议自己copy下来调试执行一遍哦

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: Junius 
@Email: see619055@gmail.com
@time: 2025/5/26 16:13 
@file: 06 定义工具和工具调用
@project: OpenAppAI
@describe: LangChain工具定义和工具调用完整入门示例
"""

from langchain_openai import ChatOpenAI
from langchain.agents import tool
from langchain.tools import Tool, StructuredTool
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain.agents.format_scratchpad import format_to_openai_function_messages
from langchain.agents import AgentExecutor
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import Optional, Type
import json
import requests
from datetime import datetime

# 初始化LLM
llm = ChatOpenAI(
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
    # openai_api_key="your_api_key_here",  # 请替换为您的API密钥.示例使用的是智谱的免费模型,你也可以进行自我注册
    model="glm-4-flash-250414"
)

print("=" * 60)
print("LangChain工具定义和工具调用完整入门示例")
print("=" * 60)

# ============================================================================
# 方式一:使用 @tool 装饰器创建工具(最简单的方式)
# ============================================================================
print("\n【方式一:使用 @tool 装饰器创建工具】")

@tool
def get_current_time(timezone: str = "Asia/Shanghai") -> str:
    """获取当前时间。
    
    Args:
        timezone: 时区,默认为"Asia/Shanghai"
        
    Returns:
        当前时间的字符串表示
    """
    from datetime import datetime
    import pytz
    
    try:
        tz = pytz.timezone(timezone)
        current_time = datetime.now(tz)
        return f"当前时间({
     
     timezone}):{
     
     current_time.strftime('%Y-%m-%d %H:%M:%S')}"
    except:
        # 如果时区不存在,返回系统时间
        current_time = datetime.now()
        return f"当前系统时间:{
     
     current_time.strftime('%Y-%m-%d %H:%M:%S')}"

@tool
def calculate_math(expression: str) -> str:
    """计算数学表达式。
    
    Args:
        expression: 要计算的数学表达式,如"2 + 3 * 4"
        
    Returns:
        计算结果
    """
    try:
        # 为了安全,只允许基本的数学运算
        allowed_chars = set('0123456789+-*/()., ')
        if not all(c in allowed_chars for c in expression):
            return "错误:表达式包含不允许的字符"
        
        result = eval(expression)
        return f"计算结果:{
     
     expression} = {
     
     result}"
    except Exception as e:
        return f"计算错误:{
     
     str(e)}"

print("✓ 使用@tool装饰器创建的工具:")
print(f"  - {
     
     get_current_time.name}: {
     
     get_current_time.description}")
print(f"  - {
     
     calculate_math.name}: {
     
     calculate_math.description}")

# ============================================================================
# 方式二:使用 Tool 类创建工具(适合简单函数)
# ============================================================================
print("\n【方式二:使用 Tool 类创建工具】")

def search_weather(location: str) -> str:
    """搜索指定位置的天气信息"""
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值