(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()  # 换行
相关推荐
开发者如是说8 小时前
Vibe Code 了产品却无人下载?我写了个工具来帮你
人工智能·程序员·产品
AI科技星8 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
战场小包8 小时前
AI 写代码越来越快,慢下来的那个人变成了我
人工智能·agent
sunywz9 小时前
【AI RAG知识库】05.【导入】【节点5】node_item_name_recognition
人工智能
彩云回9 小时前
长文档处理(Long Document Processing)策略
人工智能
AIGS0019 小时前
企业AI落地:从RAG到AgentRAG的技术跃迁
java·人工智能·人工智能ai大模型应用
程序员cxuan9 小时前
Claude Code 焚诀(一):Claude Code 六种心智模型
人工智能·后端
FlagOS智算系统软件栈9 小时前
FlagOS技术工作坊:当AI开始“自己部署自己”,大模型基础设施进入“无人驾驶”时代
人工智能
一楼的猫9 小时前
AI写作检测机制技术深度解析:200+维度检测、叙事指纹与网文AI辅助怎么过审
人工智能·学习·安全·chatgpt·ai写作
心中有国也有家9 小时前
鸿蒙 Flutter 本地存储实战:Hive CE 从入门到精讲
人工智能·hive·flutter·华为·harmonyos