当前位置: 首页 > news >正文

LangChain【5】之工具调用:连接大模型与现实世界的桥梁

文章目录

  • 零 参考学习资料
  • 一 LangChain工具调用
    • 1.1 工具调用的工作原理
    • 1.2 工具调用的优势分析
    • 1.3 使用内置工具和工具包
      • 1.3.1 使用维基百科工具
      • 1.3.2 自定义工具信息
    • 1.4 综合案例:天气识别与工具调用
      • 1.4.1 工具调用流程分析
      • 1.4.2 完整代码
      • 1.4.3 代码解析
  • 二 实际应用场景

零 参考学习资料

  • LangChain中文网 工具
    在这里插入图片描述
  • LangChain V0.3 tools
    在这里插入图片描述

一 LangChain工具调用

  • LangChain是一个强大的框架,用于构建基于大型语言模型(LLM)的应用程序。其中最重要的功能之一就是"工具调用"(Tool Calling),它允许语言模型与外部工具、API或函数进行交互,从而扩展模型的能力边界。

  • 工具调用本质上是一种让LLM能够执行特定任务的方式,这些任务超出了纯文本生成的范围,比如:查询实时数据(如天气、股票价格)、执行计算或数据处理、与数据库交互、控制外部设备或服务。

1.1 工具调用的工作原理

  • 当LLM需要执行一个它本身无法完成的任务时,它可以"调用"一个预定义的工具。这个过程通常包括以下步骤:
  1. 工具定义:开发者预先定义好工具及其功能
  2. 模型绑定:将这些工具绑定到语言模型
  3. 请求处理:模型根据用户输入决定是否需要调用工具
  4. 工具执行:如果需要,模型会生成工具调用请求
  5. 结果返回:工具执行结果可以返回给模型进行进一步处理

1.2 工具调用的优势分析

  1. 扩展模型能力:突破LLM的知识和时间限制
  2. 实时数据访问:获取最新信息而非依赖训练数据
  3. 精确操作:执行需要精确性的任务(如计算)
  4. 系统集成:连接企业系统和工作流程

1.3 使用内置工具和工具包

  • LangChain 拥有大量第三方工具。
    pip install -qU langchain-community wikipedia
    

1.3.1 使用维基百科工具

# 导入WikipediaQueryRun工具,用于执行维基百科查询
from langchain_community.tools import WikipediaQueryRun
# 导入WikipediaAPIWrapper,用于封装维基百科API的调用
from langchain_community.utilities import WikipediaAPIWrapper# 初始化WikipediaAPIWrapper实例,设置返回最多1个结果,每个结果的最大字符数为1000
api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=1000)
# 创建WikipediaQueryRun工具实例,并传入封装好的WikipediaAPIWrapper
tool = WikipediaQueryRun(api_wrapper=api_wrapper)print(f"Name: {tool.name}")
print(f"Description: {tool.description}")
print(f"args schema: {tool.args}")
print(f"returns directly?: {tool.return_direct}")# 调用tool的invoke方法,执行查询"langchain"并打印结果
print(tool.invoke({"query": "langchain"}))
Name: wikipedia
Description: A wrapper around Wikipedia. Useful for when you need to answer general questions about people, places, companies, facts, historical events, or other subjects. Input should be a search query.
args schema: {'query': {'description': 'query to look up on wikipedia', 'title': 'Query', 'type': 'string'}}
returns directly?: False
Page: LangChain
Summary: LangChain is a software framework that helps facilitate the integration of large language models (LLMs) into applications. As a language model integration framework, LangChain's use-cases largely overlap with those of language models in general, including document analysis and summarization, chatbots, and code analysis.

1.3.2 自定义工具信息

  • 可以修改内置的名称、描述和参数的 JSON 模式。在定义参数的 JSON 模式时,输入必须与函数保持一致
# 导入WikipediaQueryRun工具,用于执行维基百科查询
from langchain_community.tools import WikipediaQueryRun
# 导入WikipediaAPIWrapper,用于封装维基百科API的调用
from langchain_community.utilities import WikipediaAPIWrapper
# 导入pydantic模块中的BaseModel和Field,用于定义输入数据模型
from pydantic import BaseModel, Field# 定义输入模型类WikiInputs,继承自BaseModel
class WikiInputs(BaseModel):"""Inputs to the wikipedia tool."""query: str = Field(description="query to look up in Wikipedia, should be 3 or less words")# 初始化WikipediaAPIWrapper实例,设置返回最多1个结果,每个结果的最大字符数为1000
api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=1000)# 创建WikipediaQueryRun工具实例,并传入封装好的WikipediaAPIWrapper
tool = WikipediaQueryRun(name="wiki-tool",                            # 设置工具名称description="look up things in wikipedia",   # 设置工具描述信息args_schema=WikiInputs,                      # 指定输入参数的数据模型api_wrapper=api_wrapper,                     # 绑定使用的API封装器return_direct=True                           # 是否直接返回结果(不经过Agent处理)
)# 打印工具的相关属性信息
print(f"Name: {tool.name}")
print(f"Description: {tool.description}")
print(f"args schema: {tool.args}")
print(f"returns directly?: {tool.return_direct}")# 调用tool的invoke方法,执行查询"langchain"并打印结果
print(tool.invoke({"query": "langchain"}))
"""
invoke 是 LangChain 中定义的一个方法,用于接收一个包含输入参数的字典。
"query" 字段需要符合 WikiInputs 模型中定义的字段要求(此处为字符串类型,建议不超过3个词)。
适用于与链式调用(chain)或其他需要结构化输入输出的场景集成。
"""# 使用tool.run方法直接执行查询
print(tool.run("langchain"))
"""
run是工具类的一个便捷方法,直接接受位置参数。
在这里传入的是一个字符串 "langchain",它会自动适配到 WikiInputs 模型的 query 字段。
更适合直接快速调用工具的情况,语法更简洁。
"""
Name: wiki-tool
Description: look up things in wikipedia
args schema: {'query': {'description': 'query to look up in Wikipedia, should be 3 or less words', 'title': 'Query', 'type': 'string'}}
returns directly?: True
Page: LangChain
Summary: LangChain is a software framework that helps facilitate the integration of large language models (LLMs) into applications. As a language model integration framework, LangChain's use-cases largely overlap with those of language models in general, including document analysis and summarization, chatbots, and code analysis.
Page: LangChain
Summary: LangChain is a software framework that helps facilitate the integration of large language models (LLMs) into applications. As a language model integration framework, LangChain's use-cases largely overlap with those of language models in general, including document analysis and summarization, chatbots, and code analysis.

1.4 综合案例:天气识别与工具调用

1.4.1 工具调用流程分析

  • 通过一个完整的示例来展示如何在LangChain中实现工具调用:
    1. 定义一个天气工具
    2. 绑定到GPT-4模型
    3. 上传一张图片让模型识别天气
    4. 让模型调用适当的天气工具

1.4.2 完整代码

import base64
import os
from typing import Literalfrom langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI# 配置API环境
os.environ["OPENAI_API_KEY"] = "hk-xxx" # 从API后台获取
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"  # API基础URL# 定义天气工具
@tool
def weather_tool(weather: Literal["晴朗的", "多云的", "多雨的", "下雪的"]) -> None:"""提供天气信息的工具。Args:weather (Literal): 当前的天气状况,可以是"晴朗的"、"多云的"、"多雨的"或"下雪的"。"""pass# 读取并编码图片
image_url = "./images/img1.jpg"
with open(image_url, 'rb') as image_file:image_data = base64.b64encode(image_file.read()).decode('utf-8')# 初始化模型并绑定工具
model = ChatOpenAI(model="gpt-4o")
model_with_tools = model.bind_tools([weather_tool])# 构建包含文本和图片的消息
message = HumanMessage(content=[{"type": "text", "text": "请用中文描述一下图片的天气,并调用weather_tool来指定天气类型。"},{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_data}"}}]
)# 调用模型并获取响应
response = model_with_tools.invoke([message])
print("原始响应:", response)
print("工具调用:", response.tool_calls)
原始响应: content='这张图片展示了一个壮丽的日落景象,天空呈现出丰富的橙色、红色和黄色,阳光透过厚重的云层,反射在下方的水面上,创造出迷人的色彩效果。从图片来看,天气是多云的。\n\n现在我将调用 `weather_tool` 来指定天气类型为“多云的”。' additional_kwargs={'tool_calls': [{'id': 'call_F1ncoh6xE4PWU3ZV8x9u639j', 'function': {'arguments': '{"weather":"多云的"}', 'name': 'weather_tool'}, 'type': 'function'}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 101, 'prompt_tokens': 1220, 'total_tokens': 1321, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': None, 'text_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0, 'text_tokens': 0, 'image_tokens': 0}, 'input_tokens': 0, 'output_tokens': 0, 'input_tokens_details': None}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': None, 'id': 'chatcmpl-Bf4UOqG8C7jAHoi8YLATtMEoLKNA2', 'service_tier': None, 'finish_reason': 'tool_calls', 'logprobs': None} id='run--0fc77a81-1481-4865-9ab1-25251f9d93cd-0' tool_calls=[{'name': 'weather_tool', 'args': {'weather': '多云的'}, 'id': 'call_F1ncoh6xE4PWU3ZV8x9u639j', 'type': 'tool_call'}] usage_metadata={'input_tokens': 1220, 'output_tokens': 101, 'total_tokens': 1321, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}
[{'name': 'weather_tool', 'args': {'weather': '多云的'}, 'id': 'call_F1ncoh6xE4PWU3ZV8x9u639j', 'type': 'tool_call'}]

1.4.3 代码解析

  1. 工具定义:使用@tool装饰器定义了一个weather_tool,限定输入参数为特定的天气类型(使用Literal类型),提供了工具的描述文档字符串,这对模型理解工具用途至关重要。
  2. 图片处理:读取本地图片文件,使用base64编码图片数据,以便通过API传输。
  3. 模型配置:创建ChatOpenAI实例,指定使用gpt-4o模型,使用bind_tools方法将天气工具绑定到模型。
  4. 消息构建:创建HumanMessage对象,包含文本指令和图片数据,消息内容是一个列表,可以混合多种类型(文本、图片等)。
  5. 调用与响应:调用invoke方法发送消息,打印原始响应和工具调用信息。

二 实际应用场景

  • 这种技术可以应用于多种实际场景:
  1. 智能客服:识别用户上传的图片并调用相应服务。
  2. 内容审核:识别图片内容并调用审核工具。
  3. 医疗辅助:分析医疗影像并调用诊断工具。
  4. 零售行业:识别商品图片并调用库存查询工具。
http://www.xdnf.cn/news/906391.html

相关文章:

  • C#中的密封类与静态类:特性、区别与应用实例
  • (力扣)80. 删除有序数组中的重复项 II
  • Seed1.5-VL登顶,国产闭源模型弯道超车丨多模态模型5月最新榜单揭晓
  • 计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析
  • C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
  • java复习 03
  • css元素的after制作斜向的删除线
  • 【Go面试陷阱】对未初始化的chan进行读写为何会卡死?
  • Jenkins 工作流程
  • NoSQL之redis哨兵
  • 《SQL基础教程》第五章 SQL进阶之路:掌握高级查询的核心技巧
  • 2.1 Windows编译环境介绍
  • Caliper 配置文件解析:config.yaml
  • 加密货币钱包开发指南:多链资产管理与非托管安全范式
  • 关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
  • Appium+python自动化(十一)- 元素定位- 下
  • 串:探索 KMP 算法的高效模式匹配之旅
  • Nestjs框架: nestjs-schedule模块注册流程,源码解析与定时备份数据库
  • 【通义万相 Wan2.1】在并行智算云上的部署教程
  • 跨分割信号的回流路径处理
  • 毫米波雷达基础理论(3D+4D)
  • 【Servo】信号激励;激励数据、采集数据、跟踪数据
  • 我爱学算法之—— 前缀和(中)
  • 进程的详解,命令行参数,程序的地址空间(Linux)
  • 学习日记-day23-6.6
  • C++11异常特性
  • 如何计算光伏工程造价预算表?
  • YUM仓库编译出现`conflicting requests`问题解决方案
  • [Java恶补day17] 41. 缺失的第一个正数
  • AirSim/Cosys-AirSim 游戏开发(三)打包可执行文件