LangChain工具函数实践:让AI能力连接生活!

LangChain工具函数实践:让AI能力连接生活!

引言

在构建AI应用时,我们经常需要让AI模型具备调用外部功能的能力。LangChain提供了强大的工具函数(Tools)机制,使我们能够轻松地扩展AI模型的能力。本文将详细介绍如何在LangChain中实现和使用工具函数。

环境准备

import os
from os import environ
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from dotenv import load_dotenv
import datetime

# 加载环境变量
load_dotenv()

配置模型

model = ChatOpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("KEY"),
    model="google/gemini-2.0-flash-001"
)

工具函数实现

1. 使用@tool装饰器

这是最简单的工具函数定义方式:

@tool
def get_date():
    """获取当前日期"""
    return datetime.datetime.now().strftime("%Y-%m-%d")

@tool
def get_weather(region: str):
    """
    获取指定地区的天气
    :param region: 地区
    :return: 天气信息
    """
    return f"{region}晴天,25度"

2. 使用StructuredTool

另一种更灵活的方式:

def get_sunset(region: str):
    """
    获取指定地区的日落时间
    :param region: 地区
    :return: 日落时间
    """
    return f"{region}日落时间为18:30"

# 将函数转换为工具
getSunsetTool = StructuredTool.from_function(
    func=get_sunset,
    description="获取指定地区的日落时间",
    name="get_sunset"
)

工具绑定与使用

1. 绑定工具到模型

# 方式1:直接绑定工具列表
llm_with_tools = model.bind_tools([get_date, get_weather, getSunsetTool])

# 方式2:创建工具字典
all_tools = {
    "get_date": get_date,
    "get_weather": get_weather,
    "get_sunset": getSunsetTool
}

2. 使用工具处理查询

def process_query(query):
    message = [query]
    
    # 获取AI响应
    ai_msg = llm_with_tools.invoke(message)
    print(ai_msg)
    message.append(ai_msg)
    
    # 处理工具调用
    if ai_msg.additional_kwargs:
        for tool_call in ai_msg.tool_calls:
            tool_result = all_tools[tool_call['name'].lower()]
            tool_msg = tool_result.invoke(tool_call)
            message.append(tool_msg)
    
    # 获取最终响应
    final_response = llm_with_tools.invoke(message).content
    return final_response

使用示例

# 查询当前日期
query1 = "今天是几月几号"

# 查询天气
query2 = "上海今天天气怎么样"

# 复合查询
query3 = "上海今天天气怎么样,几点有日落"

# 处理查询
result = process_query(query3)
print(result)

技术要点解析

  1. 工具函数定义

    • 使用@tool装饰器
    • 使用StructuredTool.from_function
    • 必须提供清晰的文档字符串
  2. 参数类型

    • 明确定义参数类型
    • 提供参数说明
    • 返回值说明
  3. 工具绑定

    • 支持多个工具同时绑定
    • 工具名称需要唯一
    • 支持动态调用
  4. 消息处理

    • 维护对话上下文
    • 处理工具调用结果
    • 生成最终响应

最佳实践

1. 工具函数命名和描述

@tool
def get_weather(region: str):
    """
    获取指定地区的天气信息
    Args:
        region: 地区名称(如:北京、上海)
    Returns:
        str: 天气描述
    """
    return f"{region}晴天,25度"

2. 错误处理

@tool
def safe_get_weather(region: str):
    try:
        # 实际的天气API调用
        return f"{region}晴天,25度"
    except Exception as e:
        return f"获取{region}天气信息失败:{str(e)}"

3. 工具组合使用

def get_weather_report(region: str):
    weather = get_weather(region)
    sunset = get_sunset(region)
    return f"{region}天气报告:{weather}{sunset}"

应用场景

  1. 信息查询

    • 天气查询
    • 时间日期
    • 地理信息
  2. 数据处理

    • 数据转换
    • 计算功能
    • 格式化输出
  3. 系统集成

    • API调用
    • 数据库操作
    • 文件处理

注意事项

  1. 安全性

    • 输入验证
    • 权限控制
    • 敏感信息保护
  2. 性能

    • 避免耗时操作
    • 合理使用缓存
    • 异步处理
  3. 可维护性

    • 清晰的文档
    • 模块化设计
    • 错误处理

结论

LangChain的工具函数机制为AI模型提供了强大的扩展能力,通过合理使用工具函数,我们可以构建更加智能和实用的AI应用。

参考资料

  • LangChain官方文档
  • Python装饰器文档
  • AI工具集成最佳实践

通过本文的介绍,你应该能够掌握如何在LangChain中实现和使用工具函数,为AI模型赋予更多实用的能力。

<think>嗯,用户再次询问LangChain框架的定义以及`tools+[time]`的具体含义。看来用户对LangChain的架构设计很感兴趣,可能正在学习或实践中遇到相关概念需要澄清。注意到用户提供的参考资料很丰富,特别是引用[3]展示了从函数创建工具的实际代码示例,而引用[4]则详细说明了多输入工具使用场景。这些材料正好可以辅助解释核心概念。关于LangChain的定义,需要突出三个核心特性:模块化(chain,agent等组件)、可扩展性(支持自定义工具)和语言模型桥梁作用。在解释时要避免过于抽象,可以结合用户展示的问答机器人示例[^3]。对于`tools+[time]`的解析要更深入些。上次回复已经说明是列表合并操作,这次可以补充:1)时间工具的典型实现方式(如引用[3]的@tool装饰器用法)2)结构化工具的特殊处理(引用[4]的StructuredTool类)3)强调这种语法不会覆盖原有工具,而是创建新列表用户似乎对底层机制有探究欲,可能需要提示工具调度原理:当agent收到"现在几点"类查询时,会优先匹配description包含"time"的工具,这时新加的time工具就会被激活[^1]。值得注意的风险点是工具命名冲突,这在引用[4]的multiplier示例中也有体现。建议在回答里加入小提醒:如果原有tools已包含同名工具,后添加的会覆盖前者。</think> 以下是对LangChain框架及`tools+[time]`参数的完整解析: ### 一、LangChain框架定义 LangChain是一个开源的**AI应用开发框架**,核心功能是将大型语言模型(LLM)与外部工具和数据源连接,实现: 1. **模块化架构**:提供$$ Agent, Chain, Tool $$等标准化组件 2. **工具集成**:支持200+内置工具(搜索引擎/计算器/API等)[^2] 3. **工作流控制**:通过链式调用(Chains)协调多步骤任务[^3] 4. **记忆管理**:维护对话上下文状态 例如实现问答机器人的典型流程: ```python # 伪代码参考引用[3] 加载文档 → 文本分块 → 向量化存储 → 创建检索链 → 执行查询 ``` ### 二、`tools+[time]`参数详解 在函数`initialize_agent(tools+[time], ...)`中: 1. **基础结构** - `tools`:已有工具列表(如搜索工具、计算器) - `[time]`:包含时间工具的新列表 - `+` 运算符:合并两个列表为新工具集合 2. **实际作用** ```mermaid graph LR A[原工具集 tools] --> C[合并工具集] B[新增时间工具 time] --> C C --> D[代理获得时间处理能力] ``` 3. **技术本质** - 等同于:`new_tools = list(tools).append(time_tool)` - 时间工具定义示例(引用[3]): ```python @tool def get_time() -> str: '''返回当前系统时间''' import datetime return datetime.now().strftime("%H:%M") ``` ### 三、典型应用场景 | 查询示例 | 工具调用 | 实现原理 | |---------|---------|----------| | “现在几点?” | `time`工具 | 直接返回系统时间 | | “30分钟后提醒我” | `time`+计算器 | 时间工具获取当前时间,计算器添加30分钟 | | “北京时间转纽约时间” | `time`+时区转换工具 | 多工具协同处理[^4] | > ⚠️ **注意事项** > 1. 避免工具名冲突(如已有`time`工具需重命名) > 2. 时间工具需明确定义时区处理逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值