(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()  # 换行
相关推荐
Muyuan19981 分钟前
22.让 RAG Agent 更像真实产品:聊天页面优化、PDF 上传、知识库重建与检索片段展示
python·django·pdf·fastapi
ai大模型中转api测评6 分钟前
解密 GPT-5.5:原生多模态架构如何重定义 AI 逻辑推理与精准制图
大数据·人工智能·gpt·架构·api
冷雨夜中漫步8 分钟前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
xixixi7777712 分钟前
英伟达Agent专用全模态模型出击,仿冒AI智能体泛滥成灾,《AI伦理安全指引》即将落地——AI治理迎来“技术-风险-规范”三重奏
人工智能·5g·安全·ai·大模型·英伟达·智能体
程序员-小李12 分钟前
uv 学习总结:从零到一掌握现代化 Python 工具链
python·学习·uv
直奔標竿14 分钟前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
数据皮皮侠AI18 分钟前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
Python大数据分析@20 分钟前
CLI一键采集,使用Python搭建TikTok电商爬虫Agent
开发语言·爬虫·python
G311354227322 分钟前
如何用 QClaw 龙虾做一个规律作息健康助理 Agent
大数据·人工智能·ai·云计算
幂律智能23 分钟前
零售行业合同管理数智化转型解决方案
大数据·人工智能·零售