(LangChain实战3):LangChain阻塞式invoke与流式stream的调用

一、快速上手:两种调用方式对比

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()  # 换行
相关推荐
墨林陌几秒前
AI 热点日报(2026-09-22):AMD市值首破万亿美元,阶跃星辰发布600B开源模型
人工智能
金融小师妹2 分钟前
AI金融能力评估:18个主流模型金融问题平均错误率达57%
人工智能·云计算·逻辑回归·深度优先
爱吃提升7 分钟前
文生视频核心
人工智能·音视频
爱研究的小梁9 分钟前
告别实验室理想网络,真实场景下具身智能远程操控怎么干?
网络·人工智能·机器人·信息与通信
秋天的一阵风10 分钟前
⚡上线 24 小时,13% 的付费团队连夜换到 Jev:它到底什么来头?
前端·人工智能·ai编程
2601_9556624619 分钟前
抖音视频怎么做多语言配音?2026年AI配音工具与制作流程详解
人工智能·音视频·语音识别·视频
2601_9683545121 分钟前
类似 WordBuddy 的软件有哪些?各有什么优点?
人工智能
一抹烟霞24 分钟前
PCHIP 保形三次 Hermite 连续化
人工智能
pt104328 分钟前
面向AI的Cisco UCS X-Series设计-2:Cisco UCS AI规格选型
运维·人工智能