模型模块 (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)
• 快速原型/简单任务: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. 以下哪个是流式输出的正确方法?
选择题
2. temperature 参数的作用是?
编程题
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}")