【LangChain】 实战指南:从模型定义到工具调用与实时天气查询实战
2026/9/1 15:56:14 网站建设 项目流程

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

《Git深度解析》:版本管理实战全解 《Qt 极境架构》MySQL 核心技术与实战

🌟心向往之行必能


🎥Cx330🌸的简介:


目录

前言:

一. 定义聊天模型

1.1 ChatOpenAI: 最常用的模型实现

1.2 init_chat_model: 通用模型工厂函数

1.3 ChatOllama:本地部署模型支持

二、工具调用:让 LLM 连接外部世界

2.1 工具调用的核心作用

2.2 定义工具的三种方式

2.2.1 方式一:@tool 装饰器(推荐)

2.2.2 方式二:StructuredTool 类

2.3 工具的绑定与调用

三、实战:集成 Tavily 搜索引擎实现实时天气查询

3.1 环境准备

3.2 完整代码实现

3.3 输出结果示例

四、核心知识点总结

结尾:


前言:

随着大语言模型(LLM)的迅速发展,如何将大模型的能力无缝接入实际应用成为了开发者最关注的问题。LangChain 作为目前最流行的 LLM 开发框架,通过封装模型抽象、提示词模板、链式调用以及工具扩展等功能,极大地降低了大模型应用的开发门槛。

在实际开发中,单一的模型对话远远无法满足复杂业务需求。大语言模型存在知识库滞后、无法获取实时信息等局限,而工具调用(Tool Calling / Function Calling)正是让 LLM 连接外部真实世界的钥匙。

本文将循序渐进地介绍 LangChain 中聊天模型的定义方式、工具调用的三大实现方案,并最终通过一个集成 Tavily 搜索引擎进行实时天气查询的实战项目,带领大家掌握 LangChain 的核心开发技巧。


一. 定义聊天模型

LangChain 提供了高度抽象的统一接口,使得开发者在切换不同模型供应商(如 OpenAI、Ollama、Anthropic 等)时,无需大规模修改业务逻辑代码。

1.1 ChatOpenAI: 最常用的模型实现

在云端模型中,OpenAI 的 GPT 系列模型使用最为广泛。LangChain 通过langchain-openai包提供了ChatOpenAI类。

核心初始化参数详解

from langchain_openai import ChatOpenAI # 完整参数示例 model = ChatOpenAI( model="gpt-4o-mini", # 模型名称 temperature=0, # 采样温度,0-2 max_tokens=None, # 最大生成令牌数 timeout=None, # 请求超时时间 max_retries=2, # 最大重试次数 # api_key="你的API_KEY", # 不写则自动从环境变量读取 # base_url="代理地址", # 国内访问需要配置 # organization="组织ID" # OpenAI 组织 ID )

关键参数深度解析

  • temperature:控制输出的随机性
    • 0:完全确定,适合代码生成、事实问答
    • 0.1-0.5:轻微变化,适合技术文档、写作
    • 0.5-1:平衡创意,适合日常对话
    • 1-2:高度随机,适合创意创作
    • >2:不推荐,通常输出无意义内容
  • max_tokens:限制模型生成的最大长度
    • Token 是 LLM 处理文本的基本单位
    • 中文:1 个汉字 ≈ 1.5-2 个 Token
    • 英文:1 个 Token ≈ 4 个字符或 0.75 个单词

基础调用示例

from langchain_core.messages import SystemMessage, HumanMessage from langchain_core.output_parsers import StrOutputParser # 定义消息列表 messages = [ SystemMessage(content="请帮我进行翻译,由英文翻译成中文!"), HumanMessage(content="my name is xiaoming") ] # 定义输出解析器,提取 AIMessage 中的 content parser = StrOutputParser() # 构建链 chain = model | parser # 调用并打印结果 print(chain.invoke(messages)) # 输出:我的名字是小明

1.2 init_chat_model: 通用模型工厂函数

为了进一步统一模型的创建逻辑,LangChain 引入了init_chat_model工厂函数。它允许开发者通过传入统一的模型名称和提供商参数,动态实例化任意聊天模型,非常适合多模型配置与切换场景。

from langchain.chat_models.base import init_chat_model # 初始化 OpenAI 模型 gpt_model = init_chat_model( model="gpt-4o-mini", model_provider="openai", temperature=0.3 ) # 初始化 DeepSeek 模型(兼容 OpenAI API) deepseek_model = init_chat_model( model="deepseek-chat", model_provider="deepseek", api_key="你的DeepSeek_API_KEY", base_url="https://api.deepseek.com/v1" ) # 测试调用 print(f"GPT-4o-mini: {gpt_model.invoke('你是谁?').content}") print(f"DeepSeek: {deepseek_model.invoke('你是谁?').content}")

1.3 ChatOllama:本地部署模型支持

如果你想使用本地部署的开源模型(如 Llama 3、DeepSeek-R1),LangChain 提供了ChatOllama支持。

前置准备

  1. 安装 Ollama:https://ollama.com/
  2. 拉取模型:ollama pull deepseek-r1:1.5b
from langchain_ollama import ChatOllama # 初始化本地模型 ollama_model = ChatOllama( model="deepseek-r1:1.5b", base_url="http://127.0.0.1:11434", temperature=0.3 ) # 测试调用 print(ollama_model.invoke("你是谁?").content)


二、工具调用:让 LLM 连接外部世界

工具调用是 LangChain 最强大的功能之一,它让 LLM 从一个 “只会说话的模型” 变成了一个 “能做事的助手”。

2.1 工具调用的核心作用

  1. 扩展能力边界:让 LLM 执行数学计算、搜索网络、操作数据库等自身无法完成的任务
  2. 保证信息实时性:获取训练数据中不存在的最新信息
  3. 处理复杂任务:将复杂请求分解为多个步骤,依次调用不同工具协同完成连接现有系统:将企业内部 API、数据库封装成工具,让 LLM 成为自然语言驱动的统一接口

2.2 定义工具的三种方式

LangChain 提供了多种定义工具的方式,核心是让 LLM 知道工具名称、工具描述、工具参数这三个关键信息。

2.2.1 方式一:@tool 装饰器(推荐)

这是最简单、最常用的工具定义方式,支持两种参数描述模式。

模式 1:Google 风格文档字符串

from langchain_core.tools import tool from typing_extensions import Annotated @tool def add( a: Annotated[int, ..., "第一个整数"], b: Annotated[int, ..., "第二个整数"], ) -> int: """两数相加 Args: a: 第一个整数 b: 第二个整数 """ return a + b # 查看工具信息 print(add.name) # add print(add.description) # 两数相加 print(add.args) # {'a': {'type': 'integer', 'description': '第一个整数'}, ...}

模式 2:依赖 Pydantic 类如果工具参数比较复杂,推荐使用 Pydantic 类定义参数 schema,提供更强的类型检查和描述能力。

from pydantic import BaseModel, Field class AddInput(BaseModel): """两数相加""" a: int = Field(..., description="第一个整数") b: int = Field(..., description="第二个整数") @tool(args_schema=AddInput) def add(a: int, b: int) -> int: return a + b

2.2.2 方式二:StructuredTool 类

如果你需要更灵活的工具定义(如异步工具、自定义响应格式),可以使用StructuredTool.from_function()

from langchain_core.tools import StructuredTool from typing import Tuple, List def add(a: int, b: int) -> Tuple[str, List[int]]: """两数相加""" nums = [a, b] content = f"{nums}相加的结果是{a+b}" return content, nums # 创建工具,区分 content 和 artifact add_tool = StructuredTool.from_function( func=add, name="ADD", description="两数相加", args_schema=AddInput, response_format="content_and_artifact" ) # 模拟大模型调用方式 result = add_tool.invoke({ "name": "ADD", "args": {"a": 3, "b": 4}, "type": "tool_call", "id": "111" }) print(result) # 输出:ToolMessage(content='[3, 4]相加的结果是7', name='ADD', tool_call_id='111', artifact=[3, 4])

2.3 工具的绑定与调用

定义好工具后,需要将工具绑定到聊天模型,然后按照 “工具选择 → 工具执行 → 结果总结” 的流程调用。

完整工具调用流程

from langchain_core.messages import HumanMessage, AIMessage, ToolMessage # 定义两个工具 @tool def add(a: int, b: int) -> int: """两数相加""" return a + b @tool def multiply(a: int, b: int) -> int: """两数相乘""" return a * b # 1. 绑定工具到模型 tools = [add, multiply] model_with_tools = model.bind_tools(tools=tools) # 2. 第一步:让模型选择工具 messages = [HumanMessage(content="2乘3等于多少?")] ai_msg = model_with_tools.invoke(messages) messages.append(ai_msg) # 查看模型返回的工具调用信息 print(ai_msg.tool_calls) # 输出:[{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_xxx', 'type': 'tool_call'}] # 3. 第二步:执行工具调用 for tool_call in ai_msg.tool_calls: # 根据工具名称选择对应的工具 selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()] tool_msg = selected_tool.invoke(tool_call) messages.append(tool_msg) # 4. 第三步:让模型根据工具结果生成最终回答 final_result = model_with_tools.invoke(messages) print(final_result.content) # 输出:2乘3等于6。

强制调用工具

默认情况下,模型会根据输入内容自动决定是否调用工具。如果你想强制模型调用某个工具,可以使用tool_choice参数。

# 强制调用任意一个工具 model_with_tools = model.bind_tools(tools=tools, tool_choice="any") # 强制调用指定工具 model_with_tools = model.bind_tools(tools=tools, tool_choice={"type": "function", "function": {"name": "add"}})


三、实战:集成 Tavily 搜索引擎实现实时天气查询

Tavily 是一个专门为 AI 设计的搜索引擎,专为智能体检索与推理需求量身打造,能够以结构化形式返回搜索结果。

3.1 环境准备

  1. 注册 Tavily 账号并获取 API Key:https://www.tavily.com/
  2. 配置系统环境变量TAVILY_API_KEY为你的 API Key
  3. 安装依赖包:
pip install langchain-tavily langchain-openai

3.2 完整代码实现

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage from langchain_tavily import TavilySearch # 1. 定义大模型 model = ChatOpenAI(model="gpt-4o-mini") # 2. 定义搜索工具,最多返回4条结果 tool = TavilySearch(max_results=4) # 3. 绑定工具到模型 model_with_tools = model.bind_tools([tool]) # 4. 第一步:用户提问,模型选择调用搜索工具 messages = [ HumanMessage("中国西安今天的天气怎么样?") ] ai_msg = model_with_tools.invoke(messages) messages.append(ai_msg) # 5. 第二步:执行搜索工具 for tool_call in ai_msg.tool_calls: tool_msg = tool.invoke(tool_call) messages.append(tool_msg) # 6. 第三步:模型根据搜索结果生成最终回答 result = model_with_tools.invoke(messages) print(result.content)

3.3 输出结果示例

根据最新的天气信息,北京今天(8月31日)的天气情况如下: **🌤️ 今日天气概况** - **天气状况**:晴间多云,夜间晴朗 - **气温**:最高气温约 **29-32℃**,最低气温约 **17-19℃** - **风力**:北转南风,3级左右(阵风可达5级),夜间转1-2级 - **降水**:无降雨,降水概率为 0% **📌 温馨提示** - 白天体感较热(体感温度约25℃),建议穿着**清凉透气的夏装**,如T恤、短袖等。 - 紫外线指数较高,外出记得**涂抹防晒霜(SPF20以上)**,并佩戴遮阳帽或太阳镜。 - 早晚温差较大(夜间最低17-19℃),如果晚归,建议备一件**薄外套**。 - 天气晴朗无雨,适合户外活动或洗车。 祝您今天出行顺利,生活愉快!😊

四、核心知识点总结

聊天模型

  1. 使用ChatOpenAI初始化 DeepSeek 模型,重点掌握temperaturemax_tokens参数
  2. 使用init_chat_model()实现多模型统一初始化
  3. 使用ChatOllama调用本地部署的开源模型

工具调用

  1. 工具的核心三要素:名称、描述、参数 schema
  2. 推荐使用@tool装饰器定义工具,简单高效
  3. 工具调用流程:工具选择 → 工具执行 → 结果总结
  4. 可以通过tool_choice参数强制模型调用指定工具

Tavily 搜索

  1. Tavily 是专为 AI 设计的搜索引擎,返回结构化结果
  2. 只需配置 API Key 即可快速集成,实现实时信息获取

结尾:

本文我们从最基础的聊天模型定义开始,逐步深入到工具调用的底层逻辑,并最终实现了一个能实时搜索天气的 AI 助手。这只是 LangChain 强大功能的冰山一角,后续我们还将学习结构化输出、流式传输、RAG 检索增强生成等高级功能,带你一步步构建生产级的 LLM 应用。如果本文对你有帮助,欢迎点赞、收藏、关注!有任何问题都可以在评论区留言交流。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询