ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【LangChain】 实战指南:从模型定义到工具调用与实时天气查询实战

【LangChain】 实战指南:从模型定义到工具调用与实时天气查询实战 个人主页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( modelgpt-4o-mini, # 模型名称 temperature0, # 采样温度0-2 max_tokensNone, # 最大生成令牌数 timeoutNone, # 请求超时时间 max_retries2, # 最大重试次数 # 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(contentmy 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( modelgpt-4o-mini, model_provideropenai, temperature0.3 ) # 初始化 DeepSeek 模型兼容 OpenAI API deepseek_model init_chat_model( modeldeepseek-chat, model_providerdeepseek, api_key你的DeepSeek_API_KEY, base_urlhttps://api.deepseek.com/v1 ) # 测试调用 print(fGPT-4o-mini: {gpt_model.invoke(你是谁).content}) print(fDeepSeek: {deepseek_model.invoke(你是谁).content})1.3 ChatOllama本地部署模型支持如果你想使用本地部署的开源模型如 Llama 3、DeepSeek-R1LangChain 提供了ChatOllama支持。前置准备安装 Ollamahttps://ollama.com/拉取模型ollama pull deepseek-r1:1.5bfrom langchain_ollama import ChatOllama # 初始化本地模型 ollama_model ChatOllama( modeldeepseek-r1:1.5b, base_urlhttp://127.0.0.1:11434, temperature0.3 ) # 测试调用 print(ollama_model.invoke(你是谁).content)二、工具调用让 LLM 连接外部世界工具调用是 LangChain 最强大的功能之一它让 LLM 从一个 “只会说话的模型” 变成了一个 “能做事的助手”。2.1 工具调用的核心作用扩展能力边界让 LLM 执行数学计算、搜索网络、操作数据库等自身无法完成的任务保证信息实时性获取训练数据中不存在的最新信息处理复杂任务将复杂请求分解为多个步骤依次调用不同工具协同完成连接现有系统将企业内部 API、数据库封装成工具让 LLM 成为自然语言驱动的统一接口2.2 定义工具的三种方式LangChain 提供了多种定义工具的方式核心是让 LLM 知道工具名称、工具描述、工具参数这三个关键信息。2.2.1 方式一tool 装饰器推荐这是最简单、最常用的工具定义方式支持两种参数描述模式。模式 1Google 风格文档字符串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_schemaAddInput) def add(a: int, b: int) - int: return a b2.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}相加的结果是{ab} return content, nums # 创建工具区分 content 和 artifact add_tool StructuredTool.from_function( funcadd, nameADD, description两数相加, args_schemaAddInput, response_formatcontent_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, nameADD, tool_call_id111, 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(toolstools) # 2. 第一步让模型选择工具 messages [HumanMessage(content2乘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(toolstools, tool_choiceany) # 强制调用指定工具 model_with_tools model.bind_tools(toolstools, tool_choice{type: function, function: {name: add}})三、实战集成 Tavily 搜索引擎实现实时天气查询Tavily 是一个专门为 AI 设计的搜索引擎专为智能体检索与推理需求量身打造能够以结构化形式返回搜索结果。3.1 环境准备注册 Tavily 账号并获取 API Keyhttps://www.tavily.com/配置系统环境变量TAVILY_API_KEY为你的 API Key安装依赖包pip install langchain-tavily langchain-openai3.2 完整代码实现from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage from langchain_tavily import TavilySearch # 1. 定义大模型 model ChatOpenAI(modelgpt-4o-mini) # 2. 定义搜索工具最多返回4条结果 tool TavilySearch(max_results4) # 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℃如果晚归建议备一件**薄外套**。 - 天气晴朗无雨适合户外活动或洗车。 祝您今天出行顺利生活愉快四、核心知识点总结聊天模型使用ChatOpenAI初始化 DeepSeek 模型重点掌握temperature和max_tokens参数使用init_chat_model()实现多模型统一初始化使用ChatOllama调用本地部署的开源模型工具调用工具的核心三要素名称、描述、参数 schema推荐使用tool装饰器定义工具简单高效工具调用流程工具选择 → 工具执行 → 结果总结可以通过tool_choice参数强制模型调用指定工具Tavily 搜索Tavily 是专为 AI 设计的搜索引擎返回结构化结果只需配置 API Key 即可快速集成实现实时信息获取结尾本文我们从最基础的聊天模型定义开始逐步深入到工具调用的底层逻辑并最终实现了一个能实时搜索天气的 AI 助手。这只是 LangChain 强大功能的冰山一角后续我们还将学习结构化输出、流式传输、RAG 检索增强生成等高级功能带你一步步构建生产级的 LLM 应用。如果本文对你有帮助欢迎点赞、收藏、关注有任何问题都可以在评论区留言交流。
返回列表