短期记忆 API 参考¶
类
-
SummarizationNode
–一个 LangGraph 节点,用于在消息超出 token 限制时对其进行总结,并用摘要消息替换它们。
-
SummarizationResult
–消息总结的结果。
-
RunningSummary
–存储先前摘要操作信息的对象。
函数
-
summarize_messages
–当消息超出 token 限制时对其进行总结,并用摘要消息替换它们。
SummarizationNode ¶
基类:RunnableCallable
一个 LangGraph 节点,用于在消息超出 token 限制时对其进行总结,并用摘要消息替换它们。
方法
-
__init__
–一个 LangGraph 节点,用于在消息超出 token 限制时对其进行总结,并用摘要消息替换它们。
__init__ ¶
__init__(
*,
model: LanguageModelLike,
max_tokens: int,
max_tokens_before_summary: int | None = None,
max_summary_tokens: int = 256,
token_counter: TokenCounter = count_tokens_approximately,
initial_summary_prompt: ChatPromptTemplate = DEFAULT_INITIAL_SUMMARY_PROMPT,
existing_summary_prompt: ChatPromptTemplate = DEFAULT_EXISTING_SUMMARY_PROMPT,
final_prompt: ChatPromptTemplate = DEFAULT_FINAL_SUMMARY_PROMPT,
input_messages_key: str = "messages",
output_messages_key: str = "summarized_messages",
name: str = "summarization",
) -> None
一个 LangGraph 节点,用于在消息超出 token 限制时对其进行总结,并用摘要消息替换它们。
处理消息从最旧到最新:一旦消息 token 的累计数量达到 `max_tokens_before_summary`,`max_tokens_before_summary` 内的所有消息(如果有系统消息,则不包括)都将被总结,并替换为一个新的摘要消息。最终的消息列表是 [summary_message] + remaining_messages。
参数
-
model
(LanguageModelLike
) –用于生成摘要的语言模型。
-
max_tokens
(int
) –最终输出中返回的最大 token 数量。仅在摘要操作后生效。
-
max_tokens_before_summary
(int | None
, 默认值:None
) –在触发摘要操作前累积的最大 token 数量。如果未提供,默认为与 `max_tokens` 相同的值。这允许在需要时,将更多的 token 放入用于摘要的 LLM 中。
注意
如果 `max_tokens_before_summary` 中的最后一条消息是带有工具调用的 AI 消息,那么所有后续的、对应的工具消息也将被总结。
注意
如果要总结的 token 数量大于 `max_tokens`,则只总结其中的最后 `max_tokens` 个。这样做是为了防止超出摘要 LLM 的上下文窗口(假设其上限为 `max_tokens`)。
-
max_summary_tokens
(int
, 默认值:256
) –为摘要预留的最大 token 数量。
注意
此参数不会传递给生成摘要的 LLM 以限制摘要的长度。它仅用于正确估计最大允许的 token 预算。如果要强制执行此限制,您需要将 `model.bind(max_tokens=max_summary_tokens)` 作为 `model` 参数传递给此函数。
-
token_counter
(TokenCounter
, 默认值:count_tokens_approximately
) –用于计算消息中 token 数量的函数。默认为近似计数。要获得更精确的计数,您可以使用 `model.get_num_tokens_from_messages`。
-
initial_summary_prompt
(ChatPromptTemplate
, 默认值:DEFAULT_INITIAL_SUMMARY_PROMPT
) –用于生成首次摘要的提示模板。
-
existing_summary_prompt
(ChatPromptTemplate
, 默认值:DEFAULT_EXISTING_SUMMARY_PROMPT
) –用于更新现有(运行中)摘要的提示模板。
-
final_prompt
(ChatPromptTemplate
, 默认值:DEFAULT_FINAL_SUMMARY_PROMPT
) –在返回前将摘要与剩余消息组合的提示模板。
-
input_messages_key
(str
, 默认值:'messages'
) –输入图状态中包含要总结的消息列表的键。
-
output_messages_key
(str
, 默认值:'summarized_messages'
) –状态更新中包含已更新消息列表的键。
警告
默认情况下,`output_messages_key` 与 `input_messages_key` 不同。这样做是为了将总结后的消息与图状态中的主消息列表(即 `input_messages_key`)解耦。只有当您希望覆盖主消息列表(即 `input_messages_key`)时,才应将它们设置为相同。
-
name
(str
, 默认值:'summarization'
) –摘要节点的名称。
返回
-
None
–
示例
from typing import Any, TypedDict
from langchain_openai import ChatOpenAI
from langchain_core.messages import AnyMessage
from langgraph.graph import StateGraph, START, MessagesState
from langgraph.checkpoint.memory import InMemorySaver
from langmem.short_term import SummarizationNode, RunningSummary
model = ChatOpenAI(model="gpt-4o")
summarization_model = model.bind(max_tokens=128)
class State(MessagesState):
context: dict[str, Any]
class LLMInputState(TypedDict):
summarized_messages: list[AnyMessage]
context: dict[str, Any]
summarization_node = SummarizationNode(
model=summarization_model,
max_tokens=256,
max_tokens_before_summary=256,
max_summary_tokens=128,
)
def call_model(state: LLMInputState):
response = model.invoke(state["summarized_messages"])
return {"messages": [response]}
checkpointer = InMemorySaver()
workflow = StateGraph(State)
workflow.add_node(call_model)
workflow.add_node("summarize", summarization_node)
workflow.add_edge(START, "summarize")
workflow.add_edge("summarize", "call_model")
graph = workflow.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "1"}}
graph.invoke({"messages": "hi, my name is bob"}, config)
graph.invoke({"messages": "write a short poem about cats"}, config)
graph.invoke({"messages": "now do the same but for dogs"}, config)
graph.invoke({"messages": "what's my name?"}, config)
SummarizationResult dataclass
¶
消息总结的结果。
属性
-
messages
(list[AnyMessage]
) –总结后准备好输入到 LLM 的更新消息列表,包括一条包含摘要的消息(如果有)。
-
running_summary
(RunningSummary | None
) –关于先前摘要操作的信息(摘要和先前已总结消息的 ID)。
running_summary class-attribute
instance-attribute
¶
running_summary: RunningSummary | None = None
关于先前摘要操作的信息(摘要和先前已总结消息的 ID)。如果没有执行摘要操作(消息不足以进行摘要),则可以为 `None`。
RunningSummary dataclass
¶
存储先前摘要操作信息的对象。
用于后续调用 `summarize_messages`,以避免重复总结相同的消息。
属性
-
summary
(str
) –消息的最新摘要,每次执行摘要操作时都会更新。
-
summarized_message_ids
(set[str]
) –所有先前已总结消息的 ID。
-
last_summarized_message_id
(str | None
) –最后总结的消息的 ID。
summarize_messages ¶
summarize_messages(
messages: list[AnyMessage],
*,
running_summary: RunningSummary | None,
model: LanguageModelLike,
max_tokens: int,
max_tokens_before_summary: int | None = None,
max_summary_tokens: int = 256,
token_counter: TokenCounter = count_tokens_approximately,
initial_summary_prompt: ChatPromptTemplate = DEFAULT_INITIAL_SUMMARY_PROMPT,
existing_summary_prompt: ChatPromptTemplate = DEFAULT_EXISTING_SUMMARY_PROMPT,
final_prompt: ChatPromptTemplate = DEFAULT_FINAL_SUMMARY_PROMPT,
) -> SummarizationResult
当消息超出 token 限制时对其进行总结,并用摘要消息替换它们。
此函数从最旧到最新处理消息:一旦消息 token 的累计数量达到 `max_tokens_before_summary`,`max_tokens_before_summary` 内的所有消息(如果有系统消息,则不包括)都将被总结,并替换为一个新的摘要消息。最终的消息列表是 [summary_message] + remaining_messages。
参数
-
messages
(list[AnyMessage]
) –要处理的消息列表。
-
running_summary
(RunningSummary | None
) –可选的运行中摘要对象,包含先前摘要操作的信息。如果提供: - 仅处理未先前总结的消息 - 如果没有生成新的摘要,则会将运行中摘要添加到返回的消息中 - 如果需要生成新的摘要,则通过整合运行中摘要中的现有摘要值来生成
-
model
(LanguageModelLike
) –用于生成摘要的语言模型。
-
max_tokens
(int
) –最终输出中返回的最大 token 数量。仅在摘要操作后生效。此值也将用作提供给摘要 LLM 的最大 token 数量。
-
max_tokens_before_summary
(int | None
, 默认值:None
) –在触发摘要操作前累积的最大 token 数量。如果未提供,默认为与 `max_tokens` 相同的值。这允许在需要时,将更多的 token 放入用于摘要的 LLM 中。
注意
如果 `max_tokens_before_summary` 中的最后一条消息是带有工具调用的 AI 消息,那么所有后续的、对应的工具消息也将被总结。
注意
如果要总结的 token 数量大于 `max_tokens`,则只总结其中的最后 `max_tokens` 个。这样做是为了防止超出摘要 LLM 的上下文窗口(假设其上限为 `max_tokens`)。
-
max_summary_tokens
(int
, 默认值:256
) –为摘要预留的最大 token 数量。
注意
此参数不会传递给生成摘要的 LLM 以限制摘要的长度。它仅用于正确估计最大允许的 token 预算。如果要强制执行此限制,您需要将 `model.bind(max_tokens=max_summary_tokens)` 作为 `model` 参数传递给此函数。
-
token_counter
(TokenCounter
, 默认值:count_tokens_approximately
) –用于计算消息中 token 数量的函数。默认为近似计数。要获得更精确的计数,您可以使用 `model.get_num_tokens_from_messages`。
-
initial_summary_prompt
(ChatPromptTemplate
, 默认值:DEFAULT_INITIAL_SUMMARY_PROMPT
) –用于生成首次摘要的提示模板。
-
existing_summary_prompt
(ChatPromptTemplate
, 默认值:DEFAULT_EXISTING_SUMMARY_PROMPT
) –用于更新现有(运行中)摘要的提示模板。
-
final_prompt
(ChatPromptTemplate
, 默认值:DEFAULT_FINAL_SUMMARY_PROMPT
) –在返回前将摘要与剩余消息组合的提示模板。
返回
-
SummarizationResult
–一个 `SummarizationResult` 对象,包含更新后的消息和运行中摘要。 - `messages`: 准备好输入到 LLM 的更新消息列表 - `running_summary`: `RunningSummary` 对象 - `summary`: 最新摘要的文本 - `summarized_message_ids`: 先前已总结消息的 ID 集合 - `last_summarized_message_id`: 最后总结的消息的 ID
示例
from langgraph.graph import StateGraph, START, MessagesState
from langgraph.checkpoint.memory import InMemorySaver
from langmem.short_term import summarize_messages, RunningSummary
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")
summarization_model = model.bind(max_tokens=128)
class SummaryState(MessagesState):
summary: RunningSummary | None
def call_model(state):
summarization_result = summarize_messages(
state["messages"],
running_summary=state.get("summary"),
model=summarization_model,
max_tokens=256,
max_tokens_before_summary=256,
max_summary_tokens=128,
)
response = model.invoke(summarization_result.messages)
state_update = {"messages": [response]}
if summarization_result.running_summary:
state_update["summary"] = summarization_result.running_summary
return state_update
checkpointer = InMemorySaver()
workflow = StateGraph(SummaryState)
workflow.add_node(call_model)
workflow.add_edge(START, "call_model")
graph = workflow.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "1"}}
graph.invoke({"messages": "hi, my name is bob"}, config)
graph.invoke({"messages": "write a short poem about cats"}, config)
graph.invoke({"messages": "now do the same but for dogs"}, config)
graph.invoke({"messages": "what's my name?"}, config)