【总结】LangChain中的中间件Middleware

目录

[1 中间件(摘要)](#1 中间件(摘要))

[2 中间件(人在回路中)](#2 中间件(人在回路中))


1 中间件(摘要)

SummarizationMiddleware:在接近上下文窗口(token limits)限制时,自动对对话历史进行摘要

python 复制代码
"""
    中间件 (摘要)
"""
# SummarizationMiddleware:在接近上下文窗口(token limits)限制时,自动对对话历史进行摘要

from langchain.tools import tool
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
from langchain.messages import HumanMessage
from dotenv import load_dotenv
load_dotenv()

@tool
def get_wheather(location: str) -> str:
    """
    Get the weather in a given location.
    Args:
        location: city name or coordinates
    """
    return "the current weather in {} is sunny".format(location)


agent = create_agent(
    model="deepseek-chat",
    tools=[get_wheather],
    system_prompt="你是一个天气助手,用户用户来查询天气",
    middleware=[
        SummarizationMiddleware(
            model="deepseek-chat",
            max_tokens_before_summary=300,  # 在 50 个 token 时触发摘要
            messages_to_keep=3,  # 摘要后保留最近 1 条消息
            summary_prompt="请用中文简要总结之前的对话内容,保留关键事实。",  # 可选
        )
    ]
)

response = agent.stream({
    "messages": [
        HumanMessage(content="南京今天天气怎么样?"),
        HumanMessage(content="我想要取个英文名?"),
        HumanMessage(content="我想去上海旅游,有什么地方,美食推荐吗?"),

    ],
}, stream_mode="messages")

for token, metadata in response:
    if token.content:
        print(token.content, end="", flush=True)

2 中间件(人在回路中)

Human-in-the-loop: 在对话中引入人工干预,以解决模型无法处理的问题

比如:收发邮件,收到邮件进行读取时,不需要人工干预,但是当agent发送邮件时,人工需要干预审核。

python 复制代码
"""
    中间件(人在回路中)

"""
# Human-in-the-loop: 在对话中引入人工干预,以解决模型无法处理的问题

from langchain.agents import create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
from langchain.tools import tool
from langchain.messages import HumanMessage
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.types import Command

from dotenv import load_dotenv
load_dotenv()

# 定义工具
@tool
def read_email_tool(query: str):
    """读取邮件内容"""
    return "邮件内容:这是一封关于下周一开会的邀请函。你需要将开会的材料准备好,分享自己的工作经验。"

@tool
def send_email_tool(content: str, receiver: str):
    """发送邮件工具"""
    # 实际场景中这里会调用邮件 API
    return f"成功发送邮件给 {receiver}, 发送的内容为:{content}"

thread_id_config = {
    "configurable":{
        "thread_id": "thread_001"
    }

}

agent = create_agent(
    model="deepseek-chat",
    checkpointer=InMemorySaver(),
    tools=[read_email_tool, send_email_tool],
    middleware=[
        HumanInTheLoopMiddleware(
        interrupt_on={
            # 要求对发送邮件进行批准、编辑或拒绝
            "send_email_tool": {
                "allowed_decisions": ["approve", "edit", "reject"],
            },
            "read_email_tool": False  # False(自动批准)
        }
    )]
)

response = agent.stream(
    {
        "messages": [
            HumanMessage(content="帮我读一下关于'开会'的邮件,并给老板 boss@qq.com 回复说我会准时参加")
        ]
    }
, stream_mode="messages",config=thread_id_config)

for token, metadata in response:
    if token.content:
        print(token.content, end="", flush=True)


snapshot = agent.get_state(thread_id_config)
print(snapshot)

if snapshot.next:
    print("\n" + "=" * 50)
    print(f"检测到人工审核请求!暂停节点: {snapshot.next}")
相关推荐
字节跳动开源27 分钟前
30 分钟搞定个人情报站:Viking AI 搜索让前沿资讯实时推到面前
数据挖掘·开源·agent
Darling噜啦啦1 小时前
揭秘 LLM 的随机性黑盒:从 Temperature + Top-K 到 LangChain Chain 工作流实战
langchain·llm
我的xiaodoujiao2 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
早点睡觉1492 小时前
Agent 工程实习复盘 03|从 Pickle 到 PostgreSQL:LangGraph Checkpoint 迁移、内存治理与可回滚发布
agent
weixin_408099673 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
早点睡觉1493 小时前
Agent 工程实习复盘 04|长对话越聊越容易崩?Request-only Summary 与 Token 预算治理
agent
去码头整点薯条ing3 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
赶紧写完去睡觉4 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀4 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
鱼毓屿御4 小时前
复习总结:把之前的所有 prompt 套路封装成可切换模板的 ask 函数
python