LangChain 实战指南:聊天模型与工具调用全解析
草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. 定义聊天模型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虽然在文本生成、翻译、问答等任务中表现出色但它本质上是一个封闭的知识系统 知识存在截止日期无法获取实时信息无法执行外部操作如计算、数据库查询、API 调用复杂任务容易出现逻辑错误或幻觉。LangChain 的出现完美解决了这些问题。它通过聊天模型接口标准化了不同 LLM 的调用方式通过工具调用机制让 LLM 具备了与外部世界交互的能力。本文将从最基础的聊天模型定义开始一步步带你实现一个能实时搜索天气的 AI 助手。一. 定义聊天模型LangChain 提供了统一的聊天模型接口让你可以无缝切换 OpenAI、DeepSeek、Ollama 等不同模型提供商无需修改业务逻辑。1.1 ChatOpenAI最常用的模型实现ChatOpenAI是 LangChain 为 OpenAI 聊天模型提供的官方实现它继承自BaseChatOpenAI并实现了标准的Runnable接口。核心初始化参数详解fromlangchain_openaiimportChatOpenAI# 完整参数示例modelChatOpenAI(modelgpt-4o-mini,# 模型名称temperature0,# 采样温度0-2max_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 个单词基础调用示例fromlangchain_core.messagesimportSystemMessage,HumanMessagefromlangchain_core.output_parsersimportStrOutputParser# 定义消息列表messages[SystemMessage(content请帮我进行翻译由英文翻译成中文),HumanMessage(contentmy name is xiaoming)]# 定义输出解析器提取 AIMessage 中的 contentparserStrOutputParser()# 构建链chainmodel|parser# 调用并打印结果print(chain.invoke(messages))# 输出我的名字是小明1.2 init_chat_model通用模型工厂函数init_chat_model()是一个更上层的工厂函数支持一键初始化多种聊天模型无需导入不同的模型类。fromlangchain.chat_models.baseimportinit_chat_model# 初始化 OpenAI 模型gpt_modelinit_chat_model(modelgpt-4o-mini,model_provideropenai,temperature0.3)# 初始化 DeepSeek 模型兼容 OpenAI APIdeepseek_modelinit_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.5bfromlangchain_ollamaimportChatOllama# 初始化本地模型ollama_modelChatOllama(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 风格文档字符串fromlangchain_core.toolsimporttoolfromtyping_extensionsimportAnnotatedtooldefadd(a:Annotated[int,...,第一个整数],b:Annotated[int,...,第二个整数],)-int:两数相加 Args: a: 第一个整数 b: 第二个整数 returnab# 查看工具信息print(add.name)# addprint(add.description)# 两数相加print(add.args)# {a: {type: integer, description: 第一个整数}, ...}模式 2依赖 Pydantic 类如果工具参数比较复杂推荐使用 Pydantic 类定义参数 schema提供更强的类型检查和描述能力。frompydanticimportBaseModel,FieldclassAddInput(BaseModel):两数相加a:intField(...,description第一个整数)b:intField(...,description第二个整数)tool(args_schemaAddInput)defadd(a:int,b:int)-int:returnab2.2.2 方式二StructuredTool 类如果你需要更灵活的工具定义如异步工具、自定义响应格式可以使用StructuredTool.from_function()。fromlangchain_core.toolsimportStructuredToolfromtypingimportTuple,Listdefadd(a:int,b:int)-Tuple[str,List[int]]:两数相加nums[a,b]contentf{nums}相加的结果是{ab}returncontent,nums# 创建工具区分 content 和 artifactadd_toolStructuredTool.from_function(funcadd,nameADD,description两数相加,args_schemaAddInput,response_formatcontent_and_artifact)# 模拟大模型调用方式resultadd_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 工具的绑定与调用定义好工具后需要将工具绑定到聊天模型然后按照 “工具选择 → 工具执行 → 结果总结” 的流程调用。完整工具调用流程fromlangchain_core.messagesimportHumanMessage,AIMessage,ToolMessage# 定义两个工具tooldefadd(a:int,b:int)-int:两数相加returnabtooldefmultiply(a:int,b:int)-int:两数相乘returna*b# 1. 绑定工具到模型tools[add,multiply]model_with_toolsmodel.bind_tools(toolstools)# 2. 第一步让模型选择工具messages[HumanMessage(content2乘3等于多少)]ai_msgmodel_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. 第二步执行工具调用fortool_callinai_msg.tool_calls:# 根据工具名称选择对应的工具selected_tool{add:add,multiply:multiply}[tool_call[name].lower()]tool_msgselected_tool.invoke(tool_call)messages.append(tool_msg)# 4. 第三步让模型根据工具结果生成最终回答final_resultmodel_with_tools.invoke(messages)print(final_result.content)# 输出2乘3等于6。强制调用工具默认情况下模型会根据输入内容自动决定是否调用工具。如果你想强制模型调用某个工具可以使用tool_choice参数。# 强制调用任意一个工具model_with_toolsmodel.bind_tools(toolstools,tool_choiceany)# 强制调用指定工具model_with_toolsmodel.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安装依赖包pipinstalllangchain-tavily langchain-openai3.2 完整代码实现fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessagefromlangchain_tavilyimportTavilySearch# 1. 定义大模型modelChatOpenAI(modelgpt-4o-mini)# 2. 定义搜索工具最多返回4条结果toolTavilySearch(max_results4)# 3. 绑定工具到模型model_with_toolsmodel.bind_tools([tool])# 4. 第一步用户提问模型选择调用搜索工具messages[HumanMessage(中国西安今天的天气怎么样?)]ai_msgmodel_with_tools.invoke(messages)messages.append(ai_msg)# 5. 第二步执行搜索工具fortool_callinai_msg.tool_calls:tool_msgtool.invoke(tool_call)messages.append(tool_msg)# 6. 第三步模型根据搜索结果生成最终回答resultmodel_with_tools.invoke(messages)print(result.content)3.3 输出结果示例今天西安的天气情况如下: - **天气**:晴天转多云 - **最高气温**:约31℃ - **最低气温**:约21℃ - 预计在晚上会有降雨。 有关更详细的信息,你可以查看[中国气象局的天气预报](https://weather.cma.cn/web/weather/V8870.html)或其他相关天气网站。四、核心知识点总结聊天模型使用ChatOpenAI初始化 OpenAI 模型重点掌握temperature和max_tokens参数使用init_chat_model()实现多模型统一初始化使用ChatOllama调用本地部署的开源模型工具调用工具的核心三要素名称、描述、参数 schema推荐使用tool装饰器定义工具简单高效工具调用流程工具选择 → 工具执行 → 结果总结可以通过tool_choice参数强制模型调用指定工具Tavily 搜索Tavily 是专为 AI 设计的搜索引擎返回结构化结果只需配置 API Key 即可快速集成实现实时信息获取结尾 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语本文我们从最基础的聊天模型定义开始逐步深入到工具调用的底层逻辑并最终实现了一个能实时搜索天气的 AI 助手。这只是 LangChain 强大功能的冰山一角后续我们还将学习结构化输出、流式传输、RAG 检索增强生成等高级功能带你一步步构建生产级的 LLM 应用。如果本文对你有帮助欢迎点赞、收藏、关注有任何问题都可以在评论区留言交流。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど