(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()  # 换行
相关推荐
月诸清酒37 分钟前
66-260522 AI 科技日报 (谷歌永久提高Antigravity平台的Gemini使用限额到3倍)
人工智能
龙腾AI白云42 分钟前
【无标题】知识图谱:AI的超级大脑
人工智能·知识图谱·tornado
土星云SaturnCloud1 小时前
土星云边缘计算设备的多模态模型部署实操
服务器·人工智能·ai·边缘计算
Rauser Mack1 小时前
编程零基础,半小时用AI做了两个经典小游戏(附完整Prompt和HTML代码)
人工智能·html·prompt
小江的记录本1 小时前
【Java并发编程】锁机制:volatile:JMM内存模型、可见性/禁止指令重排、内存屏障、单例模式中的应用(附《思维导图》+《面试高频考点清单》)
java·后端·python·mysql·单例模式·面试·职场和发展
MediaTea1 小时前
DL:卷积神经网络的基本原理与 PyTorch 实现
人工智能·pytorch·深度学习·神经网络·cnn
csdn小瓯1 小时前
前端工程化:React + TypeScript + Tailwind CSS 的组件化实践
开发语言·人工智能·python
hef2881 小时前
R包grafify:简单操作实现高效统计绘图
开发语言·python·r语言
这是谁的博客?1 小时前
Python 异步编程核心原理与实践深度解析
java·网络·python·协程·asyncio·异步编程
蓦然回首却已人去楼空1 小时前
深度学习进阶:自然语言处理|3.4 QA|用 SimpleCBOW 讲清楚 backward 为什么有的 return,有的不 return
人工智能·深度学习·自然语言处理