一、快速上手:两种调用方式对比
1.1 环境准备
python
import os
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv() # 加载.env文件中的API配置
# 初始化模型
chat_model = ChatOpenAI(
model="deepseek-chat",
base_url=os.getenv('OPENAI_BASE_URL'),
api_key=os.getenv('OPENAI_API_KEY'),
streaming=True # 启用流式支持
)
1.2 消息设置
python
# 系统提示词:设定AI角色
system_message = SystemMessage(content="你是一个程序员专家")
# 用户消息
human_message = HumanMessage(content="帮我写一份Python教学计划")
messages = [system_message, human_message]
二、阻塞式调用(invoke)
2.1 基础使用
python
# 方式一:直接调用
response = chat_model.invoke(messages)
print(f"完整响应:{response.content}")
# 方式二:带参数调用
response = chat_model.invoke(
messages,
temperature=0.7, # 控制创造性
max_tokens=500 # 限制长度
)
2.2 特点
- 同步等待:获取完整响应后才继续执行
- 简单直接:代码逻辑清晰
- 适合场景:批处理、不需要实时反馈的任务
三、流式调用(stream)
3.1 基础使用
python
# 获取生成器
res = chat_model.stream(messages)
# 逐块处理
for chunk in res:
if chunk.content:
print(chunk.content, end="", flush=True) # 实时输出
3.2 完整示例
python
def stream_demo():
"""流式调用完整示例"""
print("AI回复:", end="", flush=True)
full_response = ""
for message in chat_model.stream(messages):
if message.content:
print(message.content, end="", flush=True)
full_response += message.content
print(f"\n\n完整内容长度:{len(full_response)}字符")
return full_response
3.3 特点
- 实时反馈:边生成边显示
- 用户体验好:类似打字机效果
- 适合场景:聊天应用、长文本生成
四、两种方式对比
| 特性 | 阻塞式(invoke) | 流式(stream) |
|---|---|---|
| 响应方式 | 一次性返回完整结果 | 实时分块返回 |
| 用户体验 | 需要等待全部生成 | 即时看到结果 |
| 适用场景 | 批处理、后端任务 | 实时交互、前端展示 |
| 代码复杂度 | 简单 | 稍复杂 |
| 内存占用 | 一次性存储完整结果 | 可边处理边释放 |
五、如何选择?
场景建议:
使用阻塞式(invoke):
python
# 示例:批量处理问答
questions = ["什么是Python?", "解释一下列表推导式", "如何安装pip?"]
answers = []
for q in questions:
response = chat_model.invoke([HumanMessage(content=q)])
answers.append(response.content)
print(f"已处理:{q[:20]}...")
使用流式(stream):
python
# 示例:实时聊天机器人
def chat_with_ai():
print("开始对话(输入'退出'结束)")
while True:
user_input = input("\n你:")
if user_input == "退出":
break
print("AI:", end="", flush=True)
messages = [HumanMessage(content=user_input)]
for chunk in chat_model.stream(messages):
if chunk.content:
print(chunk.content, end="", flush=True)
print() # 换行