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
使用JsonOutputParser
或ResponseSchema
使用
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,节省成本并提高响应速度。
✅ 方法:
使用
InMemoryCache
或SQLiteCache
进行本地缓存设置环境变量启用缓存
📌 示例代码:
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("你好")
九、如何:使用聊天模型调用工具
使用 ChatAgent
或 Tool
构建具备执行能力的 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)
通过 retry
和 wait
实现更鲁棒的调用
📌 示例代码:
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+前端),可随时告诉我,我可以为你提供完整的部署方案。