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

LangChain 入门到精通企业项目实践之 LangChain 聊天模型

LangChain 中的 聊天模型(Chat Models) 是专为处理对话和结构化交互设计的核心模块,相较于传统的 LLM 模型,它更贴近真实场景中的多轮交互需求,能自动管理对话上下文、调用工具、处理结构化输出等。


一、如何:使用聊天模型进行函数/工具调用

聊天模型支持工具调用功能,能检索用户意图并自动触发预定义的工具,非常适合构建 AI 助手、服务代理等应用。

✅ 关键点:

  • 使用 ChatOpenAI, ChatAnthropic, ChatGoogleGenerativeAI 等 API

  • 配合 ToolExecutor 处理工具调用的逻辑

📌 示例代码:

from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calls_agent
from langchain_core.messages import HumanMessage# 工具调用函数
tools = [tool1, tool2]  # 之前定义的工具函数列表# 创建 Agent 和 AgentExecutor
agent = create_tool_calls_agent(ChatOpenAI(temperature=0), tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)# 调用工具
response = agent_executor.invoke({"input": "今天的天气怎么样?","agent_scratchpad": []
})print(response["output"])  # 输出:调用天气工具

二、如何:让模型返回结构化输出

可强制模型生成特定 JSON 格式的结果,常用于后端系统自动解析。

🛠 方式:

  • 配合 output_parser 使用 JsonOutputParserResponseSchema

  • 使用 structured_output 装饰器

📌 示例代码:

from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Fieldclass Person(BaseModel):name: str = Field(description="人的名字")age: int = Field(description="人的年龄")parser = JsonOutputParser(pydantic_object=Person)
prompt = PromptTemplate.from_template("根据以下描述提出 JSON\n{description}\n{format_instructions}")chain = prompt | ChatOpenAI() | parserresult = chain.invoke({"description": "这是一个叫李四的人,年龄25岁","format_instructions": parser.get_format_instructions()
})
print(result)  # 输出: {"name": "李四", "age": 25}

三、如何:缓存模型响应以提高性能

对于相同提示可以避免重复调用 API,节省成本并提高响应速度。

✅ 方法:

  • 使用 InMemoryCacheSQLiteCache 进行本地缓存

  • 设置环境变量启用缓存

📌 示例代码:

from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache
set_llm_cache(InMemoryCache())# 第一次调用
ChatOpenAI().invoke("你好呀") 
# 第二次调用将自动命中缓存
ChatOpenAI().invoke("你好呀")

四、如何:获取日志概率(Log Probabilities)

可用于调试模型输出、判断_token合理性_,仅在部分模型中可用(如 GPT-4o)。

📌 示例代码:

from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4o", logprobs=True, top_logprobs=5)
response = llm.invoke("今天天气真好")# 输出 token 情况
print(response.response_metadata.get("logprobs"))

五、如何:创建自定义聊天模型类

常用于封装私有模型、兼容非标准接口。

✅ 继承 BaseChatModel

📌 示例模板:

from langchain.chat_models.base import BaseChatModel
from langchain.schema.messages import BaseMessageclass MyCustomChatModel(BaseChatModel):def _generate(self, messages: list[BaseMessage], **kwargs):# 实现自定义调用逻辑return ChatResult(generations=[ChatGeneration(text="自定义输出")])# 调用
mymodel = MyCustomChatModel()
response = mymodel.invoke([HumanMessage(content="你好")])

六、如何:流式传输响应

适用于 Web、移动端,让用户能立即看到部分结果。

✅ 使用 stream 函数遍历 token 生成流

📌 示例代码:

from langchain_openai import ChatOpenAImodel = ChatOpenAI()
for token in model.stream("讲一个笑话"):print(token.content, end="", flush=True)  # 逐字输出

七、如何:跟踪令牌使用情况

用于分析成本、优化提示词

✅ Chat 模型返回的 response_metadata 包含信息

📌 示例代码:

response = ChatOpenAI().invoke("你好")
usage = response.response_metadata.get("token_usage")
print("Prompt Tokens:", usage.prompt_tokens)
print("Completion Tokens:", usage.completion_tokens)

八、如何:跨提供商跟踪响应元数据

通过 RunLogHandler 或自定义 callbacks 实现标准化日志处理。

📌 示例代码:

from langchain.callbacks.base import BaseCallbackHandlerclass MyHandler(BaseCallbackHandler):def on_llm_start(self, _, __, **kwargs):print("开始生成")ChatOpenAI(callbacks=[MyHandler()]).invoke("你好")

九、如何:使用聊天模型调用工具

使用 ChatAgentTool 构建具备执行能力的 AI 助手

✅ 通过 bind_tools() 绑定函数

📌 示例代码:

from langchain.agents import Tool
from langchain_openai import ChatOpenAIdef get_weather(query):return "晴 20℃"tools = [Tool(name="天气查询", func=get_weather, description="获取天气信息")]
llm_with_tool = ChatOpenAI().bind_tools(tools)response = llm_with_tool.invoke("今天天气怎么样")  # 自动调用工具

十、如何:流式传输工具调用

返回调用名称、参数、进度等中间状态,构建透明交互体验。

✅ 使用 stream() 查看调用过程

📌 示例代码:

model = ChatOpenAI().bind_tools([tool])
for token in model.stream("今天天气如何"):print(token)  # 可查看调用状态

十一、如何:处理速率限制(Rate Limiting)

通过 retrywait 实现更鲁棒的调用

📌 示例代码:

from langchain_openai import ChatOpenAI
import timedef safe_invoke(model, prompt):for attempt in range(3):try:return model.invoke(prompt)except Exception as e:print("Rate limit hit, retrying...")time.sleep(5)return "模型请求失败"safe_invoke(ChatOpenAI(), "给我讲个故事")

十二、如何:少样本提示工具行为

提供 FewShot 样例让模型理解工具的使用方式

✅ 使用 FewShotPromptTemplate

📌 示例代码:

examples = [{"input": "看看今天天气", "tool_call": {"name": "天气", "content": {"city": "北京"}}}
]
prompt = FewShotPromptTemplate.from_examples(examples) + "用户:{input}"

十三、如何:绑定模型特定格式的工具

不同模型对工具定义格式要求不同,需绑定适配器

✅ 使用 tool.bind()ToolWrapper


十四、如何:强制调用特定工具

设置 force_tool_call 参数要求必须调用某工具

✅ OpenAI 支持此功能


十五、如何:使用本地模型(如 Ollama)

LangChain 支持与本地模型库 (如 Ollama、Llama.cpp、HuggingFace Transformers) 直接对接

✅ 示例(使用 Ollama):

from langchain_community.chat_models import ChatOllama
response = ChatOllama(model="llama3").invoke("你好")
print(response.content)

十六、如何:一行代码初始化任何模型

使用 ChatModelProvider 实现代码即插即用模型抽象

✅ 示例(代谢 Provider 实现封装):

from langchain_community.chat_models import ChatOllama, ChatOpenAIdef get_model(provider="openai"):if provider == "openai":return ChatOpenAI()elif provider == "ollama":return ChatOllama(model="llama3")

十七、如何:将多模态数据直接传递给模型

目前部分模型(如 GPT-4 Vision、Gemini)支持图像、视频等输入格式。

✅ LangChain 提供统一 message 封装支撑

from langchain.schema.messages import HumanMessage
from langchain.schema.messages import messages_to_dictmessage = HumanMessage(content=[{"type": "text", "text": "请描述这张图片"},{"type": "image_url", "image_url": "https://example.com/image.jpg"}]
)

🧭 开发建议与学习路径

技能等级推荐内容实践建议
入门了解聊天模型(BindTools, Stream, Prompt)使用 ChatOpenAI 完成工具调用
中级结构化输出、缓存、Callbacks、FewShot创建可持久化的 Agent
高级模型封装、元数据追踪、多供应商切换创建支撑企业微服务的聊天机器人

✅ 总结:

LangChain 聊天模型 集成了提示工程、工具调用、缓存、流式输出、结构化输出等多种能力,是构建现代化 AI 服务的关键组件。掌握这些技能,能快速在企业级项目中构建智能客服、自动化分析、AI助手、RAG实时问答系统等高端能力。

📌 下一阶段推荐:掌握 Agent 设计思想 + LangGraph + LangSmith + Web 集成实战 👉 灵活应对真实企业用例

如需我提供 企业级增强型RAG聊天机器人模板完整项目代码包(Python+FastAPI+前端),可随时告诉我,我可以为你提供完整的部署方案。

http://www.dtcms.com/a/391157.html

相关文章:

  • crush情感分析项目01
  • 免费插件分享 | Missing References Search
  • ECU OTA测试
  • Jenkins运维之路(Slave容器节点)
  • Amazon Lambda + API Gateway 实战,无服务器架构入门
  • 芯片管脚的源电流与漏电流
  • Django+ARIMA微博舆情预警系统 SnowNLP情感分析 Echarts可视化 机器学习 大数据项目✅
  • SIMetrix 8.30仿真蓝牙天线上的无源滤波器
  • [x-cmd] 升级 x-cmd 指南
  • AXI4-Stream总线流控握手实战经验总结
  • RAWSim-O-main项目Trae解析
  • react固定容器标签超出n+展示
  • ​​HarmonyOS应用开发:从入门到实战的完整指南​
  • QT与GTK生态最新进展及特性对比(2025年)
  • 包管理器分析
  • XC7K325T-2FBG676I Xilinx AMD Kintex-7 FPGA
  • FPGA入门-红外遥控
  • qml实现多页面切换显示的导航栏
  • 20250919的学习笔记
  • iOS 26 游戏测试实战,兼容性、帧率、GPU 性能与 Liquid Glass 动效在游戏中的影响(游戏开发与 uni-app 场景指南)
  • kind部署K8S集群并将“修仙业务“部署到kind集群
  • 《C++程序设计》笔记p2
  • 第1章:项目前言
  • 实现类似word 文档下划线输入功能
  • AR技术赋能高风险作业:重塑安全与效率
  • Axure-图片旋转人机验证
  • web:ts中class、interface、type的区别
  • css中的vm和vh,页面滚动的卡片网页
  • git cherry pick怎么用
  • 40岁从智驾转具身智能之路