模型模块 (Models)

统一接口调用多种大语言模型

模型类型

LangChain 提供两种主要的模型接口:

类型 用途 输入 输出
LLM 文本补全 字符串 字符串
ChatModel 对话交互 消息列表 消息

基础用法

1. OpenAI 模型

python
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAI

# ChatModel - 推荐
chat = ChatOpenAI(
    model="gpt-4o",
    temperature=0.7,
    max_tokens=1000
)

# LLM - 传统文本补全
llm = OpenAI(
    model="gpt-3.5-turbo-instruct",
    temperature=0.5
)

# 调用 ChatModel
response = chat.invoke([
    {"role": "user", "content": "你好,请介绍一下你自己"}
])
print(response.content)

# 调用 LLM
completion = llm.invoke("Once upon a time")
print(completion)

2. Anthropic Claude

python
from langchain_anthropic import ChatAnthropic

chat = ChatAnthropic(
    model="claude-sonnet-4-5-20250514",
    temperature=0.7,
    max_tokens=2000,
    anthropic_api_key="your-api-key"
)

response = chat.invoke([
    {"role": "user", "content": "解释什么是机器学习"}
])
print(response.content)

3. Google Gemini

python
from langchain_google_genai import ChatGoogleGenerativeAI

chat = ChatGoogleGenerativeAI(
    model="gemini-2.0-flash-exp",
    temperature=0.7,
    google_api_key="your-api-key"
)

response = chat.invoke([
    {"role": "user", "content": "用 Python 写一个快速排序"}
])
print(response.content)

流式输出

流式输出可以逐块获取响应,提升用户体验:

python
from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model="gpt-4o")

# 方法一:使用 stream()
print("流式输出:")
for chunk in chat.stream("讲一个简短的故事"):
    print(chunk.content, end="", flush=True)

# 方法二:使用 astream() - 异步
import asyncio

async def async_stream():
    print("\n异步流式输出:")
    async for chunk in chat.astream("用一句话描述 Python"):
        print(chunk.content, end="", flush=True)

asyncio.run(async_stream())

结构化输出

使用 with_structured_output 获取格式化的 JSON 输出:

python
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field

# 定义输出结构
class WeatherInfo(BaseModel):
    """天气信息"""
    location: str = Field(..., description="位置")
    temperature: float = Field(..., description="温度(摄氏度)")
    condition: str = Field(..., description="天气状况")
    humidity: int = Field(..., description="湿度百分比")

# 创建结构化输出模型
chat = ChatOpenAI(model="gpt-4o")
structured_chat = chat.with_structured_output(WeatherInfo)

# 调用
result = structured_chat.invoke("北京今天的天气:温度25度,晴天,湿度60%")
print(f"位置: {result.location}")
print(f"温度: {result.temperature}°C")
print(f"天气: {result.condition}")
print(f"湿度: {result.humidity}%")

多模态输入

支持文本、图片等多种输入类型:

python
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage

chat = ChatOpenAI(model="gpt-4o")

# 图片分析
message = HumanMessage(
    content=[
        {"type": "text", "text": "这张图片里有什么?"},
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/image.jpg"
            }
        }
    ]
)

response = chat.invoke([message])
print(response.content)

模型参数详解

参数 类型 默认值 说明
model str - 模型名称(必需)
temperature float 0.7 随机性(0-2),越高越随机
max_tokens int - 最大输出 tokens
top_p float 1.0 核采样(0-1)
frequency_penalty float 0 频率惩罚(-2到2)
presence_penalty float 0 存在惩罚(-2到2)
stop list null 停止序列

生产级配置

重试机制

python
from langchain_openai import ChatOpenAI
from langchain_core.rate_limiters import InMemoryRateLimiter

chat = ChatOpenAI(
    model="gpt-4o",
    # 速率限制
    rate_limiter=InMemoryRateLimiter(
        requests_per_second=10,
        check_interval=0.1
    ),
    # 超时设置
    request_timeout=30,
    # 最大重试次数
    max_retries=3
)

成本追踪

python
from langchain_openai import ChatOpenAI
from langchain.callbacks import get_openai_callback

chat = ChatOpenAI(model="gpt-4o")

# 追踪成本
with get_openai_callback() as cb:
    response = chat.invoke("写一首关于编程的诗")
    print(response.content)

    # 打印成本信息
    print(f"\n总成本: ${cb.total_cost:.4f}")
    print(f"输入 tokens: {cb.prompt_tokens}")
    print(f"输出 tokens: {cb.completion_tokens}")
    print(f"总 tokens: {cb.total_tokens}")

模型选择指南

graph TD
    A[模型选择] --> B{任务类型}

    B -->|对话| C[ChatModel]
    B -->|文本补全| D[LLM]

    C --> E{场景}
    C -->|简单任务| F[GPT-4o-mini]
    C -->|复杂推理| G[GPT-4o / Claude 3.5 Sonnet]
    C -->|超长上下文| H[Claude 3 Opus]

    D --> I{场景}
    D -->|代码补全| J[GPT-4]
    D -->|文本生成| K[GPT-3.5-turbo-instruct]
模型选择建议
• 快速原型/简单任务:GPT-4o-mini(成本最低)
• 日常对话/中等复杂度:GPT-4o、Claude 3.5 Sonnet
• 复杂推理/代码生成:GPT-4o、Claude 3 Opus
• 超长上下文:Claude 3(200K tokens)

常见问题

Q: ChatModel 和 LLM 如何选择?

A:绝大多数情况使用 ChatModel。LLM 主要用于特定的文本补全场景(如代码补全)。

Q: 如何设置 API Key?

A:推荐使用环境变量,也可以在初始化时通过参数传入:

python
# 方式一:环境变量(推荐)
import os
os.environ["OPENAI_API_KEY"] = "your-key"

# 方式二:直接传入
chat = ChatOpenAI(
    model="gpt-4o",
    api_key="your-key"
)

✏️ 练习题

选择题 1. 以下哪个是流式输出的正确方法?
A. chat.stream_fast()
B. chat.stream()
C. chat.stream_all()
D. chat.output_stream()
选择题 2. temperature 参数的作用是?
A. 控制输出速度
B. 控制随机性
C. 控制输出长度
D. 控制模型选择
编程题 3. 创建一个 ChatModel,实现流式输出,并追踪 token 成本
查看参考答案
python
from langchain_openai import ChatOpenAI
from langchain.callbacks import get_openai_callback

chat = ChatOpenAI(model="gpt-4o", temperature=0.7)

with get_openai_callback() as cb:
    print("AI 回答:")
    for chunk in chat.stream("用三句话介绍 Python"):
        print(chunk.content, end="", flush=True)

    print(f"\n\n成本统计:")
    print(f"总 tokens: {cb.total_tokens}")
    print(f"总成本: ${cb.total_cost:.4f}")