
LangChain自定义工具的方式有三种,我发现网上的人都是copy官网的教学,很难以理解,所以自己整理了一份简单带注释的python代码,相信你自己运行一遍之后,就明白各自的使用规则了。
- @tool装饰器 - 最简单的方式
- Tool类 - 适合包装现有函数
- StructuredTool - 最强大和灵活的方式
完整示例代码如下,注释解释得非常详细了,就不再文字赘述。完整代码是可以直接执行的哦,建议自己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:
"""搜索指定位置的天气信息"""

最低0.47元/天 解锁文章
8659

被折叠的 条评论
为什么被折叠?



