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, Field

class 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() | parser

result = 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 ChatOpenAI

llm = 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 BaseMessage

class 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 ChatOpenAI

model = 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 BaseCallbackHandler

class 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 ChatOpenAI

def 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 time

def 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, ChatOpenAI

def 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_dict

message = 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+前端),可随时告诉我,我可以为你提供完整的部署方案。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐