Die Erfahrung, mit einem Freund zu kommunizieren, der immer den Inhalt des Gesprächs vergisst und jedes Mal wieder von vorne anfangen muss, ist zweifellos ineffizient und anstrengend. Doch genau das ist die Norm für die meisten aktuellen KI-Systeme. Sie sind zwar leistungsfähig, aber es fehlt ihnen in der Regel ein Schlüsselelement:Auswendiglernen.
Das Gedächtnis ist kein optionaler Zusatz, sondern eine zentrale Grundlage für den Aufbau von KI-Intelligenzen (Agenten), die wirklich lernen, sich weiterentwickeln und zusammenarbeiten können.
Kernkonzepte des AI-Gedächtnisses
Das aktuelle "Staatenlosigkeits"-Dilemma der KI
vergleichbar ChatGPT
Oder Tools wie Code-Assistenten, die den Nutzer trotz ihrer Leistungsfähigkeit dazu zwingen, Anweisungen oder Vorlieben immer wieder zu wiederholen. Diese "Gedächtnisillusion", die durch die kontextbezogenen Fenster des großen Sprachmodells und des Prompt-Engineerings entsteht, hat die Menschen zu der Annahme verleitet, dass KI bereits die Fähigkeit besitzt, sich zu erinnern.
Tatsächlich ist die große Mehrheit der KI-Intelligenzen im Wesentlichen **zustandslos**.s können sie nicht aus vergangenen Interaktionen lernen oder sich im Laufe der Zeit anpassen. Um sich von zustandslosen Werkzeugen zu wirklich autonomen zu entwickelnZustandsabhängige** Intelligenzen müssten mit echten Gedächtnismechanismen ausgestattet sein und nicht nur das Kontextfenster erweitern oder die Abrufmöglichkeiten optimieren.
Was genau sind Speicher in KI-Intelligenzen?
Im Zusammenhang mit KI-Intelligenzen ist das Gedächtnis die Fähigkeit, relevante Informationen über Zeit, Aufgaben und Sitzungen hinweg zu behalten und abzurufen. Es ermöglicht Intelligenzen, sich an frühere Interaktionen zu erinnern und diese Informationen zu nutzen, um zukünftiges Verhalten zu steuern.
Ein echtes Gedächtnis ist viel mehr als das Speichern von Chats. Es geht um den Aufbau eines sich ständig weiterentwickelnden internen Zustands, der jede Entscheidung der Intelligenz beeinflusst, selbst wenn zwei Interaktionen Wochen auseinander liegen.
Das Gedächtnis eines intelligenten Körpers wird durch drei Säulen definiert:
- StaatWahrnehmung sofortiger Informationen über die aktuelle Interaktion.
- PersistenzSitzungsübergreifender, langfristiger Wissenserhalt.
- SelektivitätInformationen: Bestimmen Sie, welche Informationen es wert sind, langfristig gespeichert zu werden.
Zusammen bilden diese drei Säulen die Grundlage für Intelligenz, um **Kontinuität** zu erreichen.
Kontextuelle Fenster, RAG und Speicherunterschiede
Typische Komponenten für die Platzierung von Speicher in der Hauptarchitektur von Intelligenzen sind große Sprachmodelle (LLMs), Planer (wie ReAct
Frameworks), Toolsets (APIs) und Retriever. Das Problem ist, dass sich keine dieser Komponenten selbst daran erinnern kann, was gestern passiert ist.
Kontextfenster ≠ Speicher
Ein weit verbreiteter Irrglaube ist, dass ein immer größer werdendes Kontextfenster das Auswendiglernen vollständig ersetzen kann. Bei diesem Ansatz gibt es jedoch einen klaren Engpass:
- hohe Kosten: mehr Wertmarken höhere Rechenkosten und Latenzzeiten mit sich bringt.
- Begrenzte InformationenPersistente Speicherung über Sitzungen hinweg ist nicht möglich, und alle Kontextinformationen gehen nach Beendigung der Sitzung verloren.
- Fehlende PrioritätensetzungAlle Informationen haben im Kontext den gleichen Status, und es ist nicht möglich, zwischen kritischen und flüchtigen Informationen zu unterscheiden.
Das Kontextfenster sorgt dafür, dass die Intelligenzen imInnerhalb einer einzigen Sitzungder Kohärenz, während das Gedächtnis ihmsitzungsübergreifendDie Intelligenz.
RAG ≠ Speicher
Generierung von Abruferweiterungen (RAG
) und Gedächtnissysteme informieren auch das LLM, aber sie lösen sehr unterschiedliche Probleme.RAG
Bei der Argumentation werden Sachinformationen aus externen Wissensdatenbanken (z. B. Dokumente, Datenbanken) abgerufen und mit Stichworten versehen, um die Genauigkeit der Antwort zu verbessern. Allerdings RAG
selbst ist zustandslos, es kümmert sich nicht um die Identität des Benutzers und kann die aktuelle Abfrage nicht mit früheren Konversationen in Beziehung setzen.
Das Gedächtnis hingegen sorgt für Kontinuität. Es zeichnet Benutzerpräferenzen, historische Entscheidungen, Erfolge und Misserfolge auf und nutzt diese Informationen für zukünftige Interaktionen.
Kurz und bündig:RAG
Es hilft den Intelligenzen, genauer zu antworten, und Erinnerungen helfen den Intelligenzen, intelligenter zu handeln. Für eine ausgereifte Intelligenz müssen beide zusammenarbeiten:RAG
liefern ihnen externes Wissen, und das Gedächtnis prägt ihr internes Verhalten.
Zur besseren Unterscheidung zwischen den drei Bereichen siehe die nachstehende Tabelle:
Charakterisierung | Kontext-Fenster | Retrieval Augmentation Generation (RAG) | Speicher |
---|---|---|---|
Funktionalität | Unmittelbarer Kontext innerhalb einer kurzen Sitzung | Abrufen von Sachinformationen aus externen Wissensdatenbanken | Speichern und Abrufen von historischen Interaktionen, Präferenzen und Zuständen |
Stand der Dinge | Zustandslos | Zustandslos | Zustandsabhängig |
Haltbarkeit | einzelne Sitzung | Die externe Wissensdatenbank ist beständig, aber der Abrufvorgang erfolgt sofort | Sitzungsübergreifende, langfristige Persistenz |
Anwendungsszenario | Aufrechterhaltung eines kohärenten Dialogs | Beantwortung dokumentenspezifischer Fragen | Personalisierung, kontinuierliches Lernen, Aufgabenautomatisierung |
AI Arten von Speicher
Das Gedächtnis von KI-Intelligenzen lässt sich in zwei Grundformen unterteilen: Kurzzeitgedächtnis und Langzeitgedächtnis, die unterschiedlichen kognitiven Funktionen dienen.
- KurzzeitgedächtnisBewahrung des unmittelbaren Kontextes in einer einzigen Interaktion, wie im menschlichen Arbeitsgedächtnis.
- Langfristiges GedächtnisBehalten Sie Ihr Wissen über mehrere Sitzungen, Aufgaben und Zeiträume hinweg, um zu lernen und sich anzupassen.
Kurzzeitgedächtnis
Das Kurzzeitgedächtnis, das auch als Arbeitsgedächtnis bezeichnet wird, ist die grundlegendste Form des Gedächtnisses für KI-Systeme und dient dazu, unmittelbare Zusammenhänge zu speichern, einschließlich:
- Dialog mit der GeschichteLetzte Nachrichten und deren Reihenfolge.
- ZwischenzustandTemporäre Variablen während der Ausführung einer Aufgabe.
- Fokus der Aufmerksamkeit: Der aktuelle Kern des Dialogs.
Langfristiges Gedächtnis
Komplexere KI-Anwendungen müssen ein Langzeitgedächtnis implementieren, um Wissen zu speichern und über mehrere Sitzungen hinweg zu personalisieren. Das Langzeitgedächtnis besteht aus drei Haupttypen:
1. prozedurales Gedächtnis
Dies ist das "Muskelgedächtnis" der Intelligenz, d. h., die Intelligenz weiß, dassWie man es machtEtwas. Sie definiert Aktionen, die die Intelligenz ausführen kann und die direkt in der Logik kodiert sind. Zum Beispiel: "Verwenden Sie einen ausführlicheren Erklärungsstil bei der Beantwortung technischer Fragen" oder "Geben Sie E-Mails von bestimmten Vorgesetzten immer Vorrang".
2. episodisches Gedächtnis
Dies ist das "Interaktionsalbum" der Intelligenz, in dem die Geschichte der Interaktionen und spezifischen Ereignisse im Zusammenhang mit einem bestimmten Nutzer aufgezeichnet werden. Es ist der Schlüssel zu Personalisierung, Kontinuität und langfristigem Lernen. So kann sich eine Intelligenz beispielsweise daran erinnern, dass "bei der letzten Anfrage eines Kunden zu einem Rechnungsproblem eine langsame Antwort zu Unzufriedenheit führte", so dass sie ihre Antwortstrategie in Zukunft optimieren kann.
3. semantisches Gedächtnis
Dies ist die "Fakten-Enzyklopädie" der Intelligenz, die objektive Fakten über die Welt und den Nutzer speichert. Dieses Wissen wird normalerweise durch Vektorsuche oder RAG
Die Suche wird unabhängig von der spezifischen Interaktion durchgeführt. Zum Beispiel: "Alice ist die technische Leiterin für Projekt A" oder "Johns Arbeitszeitzone ist PST".
Mechanismen der AI-Speicherimplementierung
Timing des Schreibens in den Speicher
Wann und wie schaffen die Intelligenzen neue Erinnerungen? Es gibt zwei gängige Ansätze:
- Synchronisiertes Schreiben in EchtzeitErstellen und aktualisieren Sie Erinnerungen in Echtzeit, während sie mit dem Benutzer interagieren. Dieser Ansatz ermöglicht es, dass neue Erinnerungen sofort wirksam werden, kann aber auch die Latenzzeit und Komplexität der Hauptanwendungslogik erhöhen. Zum Beispiel.
ChatGPT
Ein ähnlicher Mechanismus wird von der Speicherfunktion dessave_memories
Das Tool entscheidet in Echtzeit, ob Informationen in einem Dialog gespeichert werden sollen oder nicht. - Asynchrone HintergrundverarbeitungSpeichererstellung und -organisation als separate Hintergrundaufgaben behandeln. Dieser Ansatz entkoppelt die Speicherverwaltung von der Hauptanwendungslogik, verringert die Latenzzeit und ermöglicht eine komplexere Offline-Verarbeitung, z. B. die Zusammenfassung von Informationen und die Deduplizierung.
Management-Strategien für das Gedächtnis
Wenn Dialoge zu lang sind, kann das Kurzzeitgedächtnis die Grenzen des Kontextfensters des LLM überschreiten. Zu den üblichen Verwaltungsstrategien gehören:
- BeschneidenEntfernen Sie die ersten oder letzten N Nachrichten im Dialogverlauf.
- ZusammenfassungenFassen Sie den früheren Dialog zusammen und ersetzen Sie den Originaltext durch eine Zusammenfassung.
- selektives VergessenDauerhaftes Löschen eines Teils des Speichers auf der Grundlage voreingestellter Regeln (z. B. Herausfiltern unwichtiger Systemmeldungen) oder der Beurteilung des Modells.
Die Herausforderung, KI-Gedächtnis zu erreichen
Obwohl das Gedächtnis für die Intelligenz von entscheidender Bedeutung ist, steht es in der Praxis vor zahlreichen Herausforderungen:
- Überlastung des Gedächtnisses und VergessensmechanismenUnendlich angehäufte Erinnerungen können ein System aufblähen und ineffizient machen. Es ist eine Herausforderung, wirksame Vergessensmechanismen zu entwickeln, die es Intelligenzen ermöglichen, veraltete oder irrelevante Informationen zu vergessen.
- InformationsverschmutzungFalsche oder böswillige Eingaben können im Langzeitgedächtnis gespeichert werden, wodurch das Entscheidungssystem der Intelligenz "kontaminiert" wird und zu einem verzerrten zukünftigen Verhalten führt.
- Datenschutz und SicherheitEin großer Teil der sensiblen Benutzerinformationen, wie z. B. Einstellungen, Verlauf und persönliche Daten, wird im Langzeitspeicher gespeichert. Die Verschlüsselung, die Zugriffskontrolle und die Einhaltung der Vorschriften für diese Daten sind entscheidend für den Start der Anwendung.
- Kosten und LeistungDie Pflege umfangreicher Speicher und die Durchführung komplexer Abruf- und Schreibvorgänge verursachen zusätzliche Rechen- und Speicherkosten und können die Reaktionsfähigkeit des Systems beeinträchtigen.
Mit LangGraph zu intelligenten Körpern mit Gedächtnis
LangGraph
ist ein leistungsfähiges Framework für die Entwicklung zustandsorientierter, multiintelligenter Anwendungen mit natürlicher Unterstützung für Schleifen und Zustandsverwaltung, ideal für die Implementierung komplexer Speichersysteme. Das folgende Codebeispiel zeigt, wie man die LangGraph
Ergänzung der Intelligenzen durch Kurzzeit- und Langzeitgedächtnis.
Hinzufügen des Kurzzeitgedächtnisses
Das Kurzzeitgedächtnis (Thread-Level-Persistenz) ermöglicht es den Intelligenzen, einen einzelnen Dialog über mehrere Runden hinweg zu verfolgen. Ermöglicht wird dies durch die Bereitstellung eines Kurzzeitgedächtnisses für die LangGraph
Abbildung konfiguriert einen Prüfzeiger, der das automatische Speichern und Laden des Status erleichtert.
Das folgende Beispiel verwendet einen Speicher-Checkpoint InMemorySaver
um den Sitzungsstatus zu speichern.
from langchain_community.chat_models import ChatAnthropic # 假设使用Anthropic模型
from langgraph.graph import StateGraph, MessagesState, START
from langgraph.checkpoint.memory import InMemorySaver
# 为简化,假设模型已初始化
# model = ChatAnthropic(model="claude-3-5-sonnet-20240620")
# 实际使用时请替换为真实模型
class FakeModel:
def invoke(self, messages):
from langchain_core.messages import AIMessage
last_message = messages[-1].content
if "bob" in last_message:
return AIMessage(content="Hi Bob! How can I help you today?")
elif "my name" in last_message:
return AIMessage(content="Your name is Bob.")
else:
return AIMessage(content="Hello there!")
model = FakeModel()
def call_model(state: MessagesState):
response = model.invoke(state["messages"])
return {"messages": [response]}
builder = StateGraph(MessagesState)
builder.add_node("call_model", call_model)
builder.add_edge(START, "call_model")
checkpointer = InMemorySaver()
graph = builder.compile(checkpointer=checkpointer)
# 使用唯一的 thread_id 来标识一个独立的对话线程
config = {
"configurable": {
"thread_id": "user_1_thread_1"
}
}
# 第一次交互
for chunk in graph.stream(
{"messages": [{"role": "user", "content": "Hi! I'm Bob."}]},
config,
stream_mode="values",
):
chunk["messages"][-1].pretty_print()
# 第二次交互,在同一线程中
for chunk in graph.stream(
{"messages": [{"role": "user", "content": "What's my name?"}]},
config,
stream_mode="values",
):
chunk["messages"][-1].pretty_print()
================================== Ai Message ==================================
Hi Bob! How can I help you today?
================================== Ai Message ==================================
Your name is Bob.
In einer Produktionsumgebung wird die InMemorySaver
Ersetzen Sie das Datenbank-Backend durch ein persistentes, wie z.B. PostgresSaver
vielleicht MongoDBSaver
um sicherzustellen, dass der Dialogstatus nach dem Neustart des Dienstes nicht verloren geht.
Management-Kontrollpunkte
LangGraph
Bietet eine Schnittstelle für die Verwaltung von Checkpoints (d.h. den Sitzungsstatus).
Zeigt den aktuellen Stand des Themas an:
# graph.get_state(config)
Alle historischen Status des Themas anzeigen:
# list(graph.get_state_history(config))
Hinzufügen des Langzeitgedächtnisses
Der Langzeitspeicher (Thread-übergreifende Persistenz) wird verwendet, um Daten zu speichern, die lange aufbewahrt werden müssen, wie z. B. Benutzereinstellungen.LangGraph
Ermöglicht die Übergabe eines kompilierten Graphen an eine store
Objekt für diese Funktionalität.
Das folgende Beispiel zeigt, wie man die InMemoryStore
Speichert Benutzerinformationen und teilt sie über verschiedene Dialogstränge hinweg.
import uuid
from typing_extensions import TypedDict
from langchain_core.runnables import RunnableConfig
from langgraph.store.base import BaseStore
from langgraph.store.memory import InMemoryStore
# ... (复用之前的模型和 State 定义) ...
def call_model_with_long_term_memory(
state: MessagesState,
config: RunnableConfig,
*,
store: BaseStore,
):
from langchain_core.messages import AIMessage, SystemMessage
user_id = config["configurable"]["user_id"]
namespace = ("memories", user_id)
# 检索长期记忆
memories = store.search(query="", namespace=namespace)
info = "\n".join([d.value["data"] for d in memories])
system_msg_content = f"You are a helpful assistant. User info: {info}"
# 写入长期记忆
last_message = state["messages"][-1]
if "remember" in last_message.content.lower():
memory_to_save = "User's name is Bob"
# 使用唯一ID存储记忆
store.put([(str(uuid.uuid4()), {"data": memory_to_save})], namespace=namespace)
# 调用模型
response = model.invoke([SystemMessage(content=system_msg_content)] + state["messages"])
return {"messages": [response]}
builder_ltm = StateGraph(MessagesState)
builder_ltm.add_node("call_model", call_model_with_long_term_memory)
builder_ltm.add_edge(START, "call_model")
checkpointer_ltm = InMemorySaver()
store = InMemoryStore()
graph_ltm = builder_ltm.compile(
checkpointer=checkpointer_ltm,
store=store,
)
# 在线程1中,用户要求记住名字
config1 = {
"configurable": {
"thread_id": "thread_1",
"user_id": "user_123",
}
}
for chunk in graph_ltm.stream(
{"messages": [{"role": "user", "content": "Hi! Please remember my name is Bob"}]},
config1,
stream_mode="values",
):
chunk["messages"][-1].pretty_print()
# 在新的线程2中,查询名字
config2 = {
"configurable": {
"thread_id": "thread_2",
"user_id": "user_123", # 相同的 user_id
}
}
for chunk in graph_ltm.stream(
{"messages": [{"role": "user", "content": "What is my name?"}]},
config2,
stream_mode="values",
):
chunk["messages"][-1].pretty_print()
================================== Ai Message ==================================
Hi Bob! How can I help you today?
================================== Ai Message ==================================
Your name is Bob.
Semantische Suche aktivieren
Durch die Bereitstellung store
Die Konfiguration des Vektoreinbettungsmodells ermöglicht einen auf semantischer Ähnlichkeit basierenden Gedächtnisabruf, so dass die Intelligenzen relevante Informationen intelligenter abrufen können.
from langchain_openai import OpenAIEmbeddings
# 假设已初始化 OpenAIEmbeddings
# embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# store = InMemoryStore(
# index={
# "embed": embeddings,
# "dims": 1536, # 嵌入维度
# }
# )
#
# store.put([
# ("1", {"text": "I love pizza"}),
# ("2", {"text": "I am a plumber"})
# ], namespace=("user_123", "memories"))
# 在调用时,通过 query 参数进行语义搜索
# items = store.search(
# query="I'm hungry",
# namespace=("user_123", "memories"),
# limit=1
# )
# 搜索结果将是与 "I'm hungry" 最相关的 "I love pizza"。
Diese Funktion ermöglicht es den Intelligenzen, dynamisch die relevantesten Informationen aus der Speicherbank abzurufen, basierend auf dem Kontext des Dialogs, anstatt einfach nur Schlüsselwörter abzugleichen.
Fallstudie: Aufbau einer speichererweiterten E-Mail-Informationsstelle
Im Folgenden wird die Theorie in die Praxis umgesetzt, indem eine E-Mail-verarbeitende Intelligenz mit mehreren Arten von Speichern konstruiert wird.
7.1 Definition der Zustände des intelligenten Körpers
Definieren Sie zunächst die Zustände, die die Intelligenzen im Auge behalten müssen, wobei sowohl das Kurzzeit- als auch das Langzeitgedächtnis berücksichtigt werden müssen.
from typing import TypedDict, Dict, Any
from langgraph.graph import MessagesState
class EmailAgentState(TypedDict, total=False):
"""邮件智能体的状态定义"""
messages: MessagesState # 短期记忆:对话历史
user_preferences: Dict[str, Any] # 长期语义记忆:用户偏好
email_threads: Dict[str, Any] # 长期情景记忆:历史邮件线程
action: str # 决策动作
reply: str # 生成的回复
7.2 Implementierung eines Entscheidungsklassifikators (unter Verwendung des situativen Gedächtnisses)
Erstellen Sie einen Klassifizierungsknoten, der die nächste Aktion auf der Grundlage des Inhalts der E-Mail und historischer Interaktionen bestimmt (situatives Gedächtnis).
def classify_email(state: EmailAgentState):
# 此处应调用 LLM 进行分类
# 为简化,直接返回一个硬编码的决策
email_content = state["messages"][-1].content
if "urgent" in email_content.lower():
return {"action": "escalate"}
return {"action": "reply"}
7.3 Definition von Werkzeugen (mit Hilfe des semantischen Gedächtnisses)
Definieren Sie die Werkzeuge, die den Intelligenzen zur Verfügung stehen, z. B. Kontaktinformationen aus dem semantischen Gedächtnis.
from langgraph.prebuilt import ToolNode
def get_contacts_from_memory(user_id: str):
# 模拟从用户数据库或语义记忆中获取联系人
contacts_db = {
"user_123": {
"developers": ["alice@company.com"],
"managers": ["charlie@company.com"]
}
}
return contacts_db.get(user_id, {})
def send_email(to: str, subject: str, body: str):
# 模拟发送邮件API
print(f"Email sent to {to} with subject '{subject}'")
return "Email sent successfully."
tools = [get_contacts_from_memory, send_email]
tool_node = ToolNode(tools)
7.4 Einen Graphen konstruieren und Knoten verbinden
ausnutzen LangGraph
Verbinden Sie alle Komponenten zu einem ausführbaren Workflow.
from langgraph.graph import StateGraph, START, END
builder = StateGraph(EmailAgentState)
# 1. 定义节点
builder.add_node("classify", classify_email)
builder.add_node("generate_reply", lambda state: {"reply": "Generated reply based on user tone."}) # 简化版
builder.add_node("escalate_task", lambda state: print("Task Escalated!"))
# 2. 定义边
builder.add_edge(START, "classify")
builder.add_conditional_edges(
"classify",
lambda state: state["action"],
{
"reply": "generate_reply",
"escalate": "escalate_task",
}
)
builder.add_edge("generate_reply", END)
builder.add_edge("escalate_task", END)
# 3. 编译图
email_graph = builder.compile()
Dieses vereinfachte Beispiel zeigt, wie die Kombination verschiedener Arten von Erinnerungen (über Zustände und Werkzeuge) den Arbeitsablauf einer Intelligenz steuern kann. Durch die Erweiterung dieses Rahmens können leistungsstarke KI-Assistenten entwickelt werden, die in der Lage sind, komplexe Aufgaben zu bewältigen, hochgradig personalisiert sind und kontinuierlich lernen können.
Die folgenden Fragen können als wirksamer Leitfaden für die Gestaltung Ihrer eigenen gedächtnisfördernden Intelligenzen dienen:
- LerninhalteWelche Art von Informationen sollten die Intelligenzen lernen? Sind es objektive Fakten, Zusammenfassungen von historischen Ereignissen oder Verhaltensregeln?
- Zeit zum ErinnernWann und von wem soll die Gedächtnisbildung ausgelöst werden? Handelt es sich um eine Echtzeit-Interaktion oder um eine Stapelverarbeitung im Hintergrund?
- Lösungen für die LagerungWo sollen Erinnerungen gespeichert werden? Ist es eine lokale Datenbank, ein Vektorspeicher oder ein Cloud-Dienst?
- Sicherheit und DatenschutzWie lassen sich Speicherdaten vor Verlust und Missbrauch schützen?
- Aktualisierungen und WartungWie kann man verhindern, dass veraltete oder fehlerhafte Erinnerungen die Entscheidungsfindung einer Intelligenz beeinträchtigen?