目录
[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}")
