(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()  # 换行
相关推荐
用户69371750013841 分钟前
DeepSeek 调价正式生效:一夜涨 11 倍,靠低价薅羊毛的日子结束了
前端·人工智能·后端
帅气的小峰5 分钟前
pybind11与nanobind可以共存吗?如何迁移?
c++·python·cuda·推理引擎
JAI科研5 分钟前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
探物 AI7 分钟前
yolo目标检测中的激活函数对比
人工智能·yolo·目标检测
用户298698530147 分钟前
从入门到自动化:TXT 转 Word 的在线工具与代码实战方案
人工智能·后端·python
DeepIntelli8 分钟前
AI问答品牌推荐:如何用GEO让品牌出现在豆包、文心一言的答案里
人工智能
m4Rk_9 分钟前
【论文阅读】Agent 记忆机制(40):HiAgent——通过子目标级记忆提升长程任务执行能力
论文阅读·人工智能·学习·开源·github
还不秃顶的计科生11 分钟前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
静开11 分钟前
Claude Code快速窥探:原来内核就是一个 while 循环外面套了八层壳
人工智能
AIyy86613 分钟前
定制化企业网盘深度解析:技术能力、落地场景与产品选型指南
人工智能