Dostawca pamięci Neo4j

Dostawca pamięci Neo4j udostępnia agentom platformy Agent Framework trwały pamięć wspieraną przez graf wiedzy. W przeciwieństwie do dostawców RAG, którzy pobierają ze statycznych baz wiedzy, dostawca pamięci przechowuje i przypomina interakcje agentów, automatycznie wyodrębniając jednostki i tworząc wykres wiedzy w czasie.

Dostawca zarządza trzema typami pamięci:

  • Pamięć krótkoterminowa: historia konwersacji i ostatni kontekst
  • Pamięć długoterminowa: Jednostki, preferencje i fakty wyodrębnione z interakcji
  • Pamięć rozumowania: poprzednie ślady rozumowania i wzorce użycia narzędzi

Dlaczego warto używać neo4j do pamięci agenta?

  • Trwałość grafu wiedzy: pamięci są przechowywane jako połączone jednostki, a nie rekordy płaskie, dzięki czemu agent może wnioskować o relacjach między elementami, które zapamiętuje.
  • Automatyczne wyodrębnianie jednostek: konwersacje są analizowane w jednostkach strukturalnych i relacjach bez ręcznego projektowania schematu.
  • Przywoływanie między sesjami: Preferencje, fakty i ślady rozumowania są przechowywane między sesjami i pojawiają się automatycznie za pośrednictwem dostawców kontekstu.

Uwaga / Notatka

Neo4j oferuje dwie oddzielne integracje dla platformy Agent Framework. Ten dostawca (neo4j-agent-memory) jest przeznaczony dla pamięci trwałej — przechowywanie i odwoływanie interakcji z agentem, wyodrębnianie jednostek i tworzenie grafu wiedzy w czasie. Aby używać GraphRAG z istniejącego grafu wiedzy przy wykorzystaniu wektora, pełnotekstu lub wyszukiwania hybrydowego, zobacz Neo4j GraphRAG Context Provider.

Uwaga / Notatka

Pakiet .NET (AgentMemory) to niezależny, utrzymywany przez społeczność port .NET dostawcy pamięci Neo4j Labs — nie jest to oficjalny pakiet Neo4j Labs. Zobacz repozytorium AgentMemory (.NET), aby uzyskać kod źródłowy i szczegółowe informacje.

Wymagania wstępne

  • Instancja Neo4j (samodzielnie hostowana lub Neo4j AuraDB)
  • Wdrożenie Azure OpenAI lub Microsoft Foundry (model czatu i model osadzania)
  • Zestaw zmiennych środowiskowych: NEO4J_URI, NEO4J_USERNAME, , NEO4J_PASSWORDAZURE_OPENAI_ENDPOINT
  • poświadczenia skonfigurowane w interfejsie wiersza polecenia Azure CLI (az login) lub klucz API
  • .NET 8.0 lub nowszy

Installation

dotnet add package AgentMemory
dotnet add package AgentMemory.AgentFramework

Użycie

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using AgentMemory;
using AgentMemory.Abstractions.Services;
using AgentMemory.AgentFramework;
using AgentMemory.AgentFramework.Tools;

var builder = Host.CreateApplicationBuilder(args);

// Registers Core + Neo4j infrastructure in one call (reads NEO4J_URI / NEO4J_USERNAME /
// NEO4J_PASSWORD, falling back to local-dev defaults). Passing configureLlm opts in to
// LLM-backed entity/fact/preference extraction, using the IChatClient registered below.
builder.Services.AddNeo4jAgentMemory(
    configureMemory: _ => { },
    configureNeo4j: neo4j =>
    {
        neo4j.Uri = Environment.GetEnvironmentVariable("NEO4J_URI") ?? "bolt://localhost:7687";
        neo4j.Username = Environment.GetEnvironmentVariable("NEO4J_USERNAME") ?? "neo4j";
        neo4j.Password = Environment.GetEnvironmentVariable("NEO4J_PASSWORD") ?? "password";
    },
    configureLlm: _ => { });

// Any Microsoft.Extensions.AI-compatible chat + embedding client works
var azureClient = new AzureOpenAIClient(
    new Uri(Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!), new DefaultAzureCredential());
builder.Services.AddSingleton(azureClient.GetChatClient("gpt-4o-mini").AsIChatClient());
builder.Services.AddSingleton(azureClient.GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator());

// AutoExtractOnPersist builds the knowledge graph from every conversation turn
builder.Services.AddAgentMemoryFramework(options =>
{
    options.AutoExtractOnPersist = true;
    options.ContextFormat.IncludeEntities = true;
    options.ContextFormat.IncludeFacts = true;
    options.ContextFormat.IncludePreferences = true;
});

using var host = builder.Build();
await using var scope = host.Services.CreateAsyncScope();
var services = scope.ServiceProvider;

// Bootstraps Neo4j schema/indexes on first run (idempotent)
await services.GetRequiredService<ISchemaBootstrapper>().BootstrapAsync();

var memoryProvider = services.GetRequiredService<Neo4jMemoryContextProvider>();
var memoryTools = services.GetRequiredService<MemoryToolFactory>().CreateAIFunctions();

// WithMemoryOwnerScoping wraps the whole invocation — recall, the tool-calling loop, and
// persistence — in the owner scope set by WithMemoryIdentity below, so no manual
// BeginOwnerScope call is needed around RunAsync.
AIAgent agent = services.GetRequiredService<IChatClient>().AsAIAgent(new ChatClientAgentOptions
{
    ChatOptions = new ChatOptions
    {
        Instructions = "You are a helpful assistant with persistent memory.",
        Tools = [.. memoryTools],
    },
    AIContextProviders = [memoryProvider],
}).WithMemoryOwnerScoping(services);

var session = (await agent.CreateSessionAsync())
    .WithMemoryIdentity(userId: "user-123", sessionId: "session-1", applicationId: "my-app");

var response = await agent.RunAsync("Remember that I prefer window seats on flights.", session);

Kluczowe funkcje

  • Dwukierunkowe: Neo4jMemoryContextProvider przypomina odpowiednią pamięć przed każdym uruchomieniem i utrwala nową pamięć po — nie jest wymagane ręczne okablowanie
  • Wyodrębnianie jednostek: tworzy wykres wiedzy z konwersacji przy użyciu konfigurowalnego potoku wyodrębniania (AutoExtractOnPersist)
  • Uczenie się preferencji: wyciąga wnioski na temat preferencji użytkownika, faktów i encji oraz przechowuje je, automatycznie przywoływane przez zupełnie nowe AgentSession dla tego samego użytkownika
  • Narzędzia pamięci: MemoryToolFactory udostępnia elementy AIFunction, aby model mógł w sposób jawny wyszukiwać, zapamiętywać i przywoływać
  • Najpierw wstrzykiwanie zależności: rejestruje się za pośrednictwem AddNeo4jAgentMemory (podłącza wewnętrznie Core + Neo4j) i AddAgentMemoryFramework, w sposób naturalny dopasowany do ogólnego hosta i aplikacji ASP.NET Core
  • Oprócz Agent Framework: ta sama biblioteka integruje się także z klientami Semantic Kernel i MCP oraz obejmuje wbudowaną obserwowalność OpenTelemetry

Zasoby

Wymagania wstępne

  • Instancja Neo4j (samodzielnie hostowana lub Neo4j AuraDB)
  • Projekt usługi Azure AI Foundry z wdrożonym modelem czatu
  • Klucz interfejsu API openAI lub wdrożenie usługi Azure OpenAI (na potrzeby osadzania i wyodrębniania jednostek)
  • Zestaw zmiennych środowiskowych: NEO4J_URI, , NEO4J_PASSWORDFOUNDRY_PROJECT_ENDPOINT, , FOUNDRY_MODELOPENAI_API_KEY
  • Skonfigurowane poświadczenia Azure CLI (az login)
  • Python 3.10 lub nowszy

Installation

pip install neo4j-agent-memory[microsoft-agent]

Użycie

import os
from pydantic import SecretStr
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity.aio import AzureCliCredential
from neo4j_agent_memory import MemoryClient, MemorySettings
from neo4j_agent_memory.integrations.microsoft_agent import (
    Neo4jMicrosoftMemory,
    create_memory_tools,
)

# Pass Neo4j and embedding configuration directly via constructor arguments.
# MemorySettings also supports loading from environment variables or .env files
# using the NAM_ prefix (e.g. NAM_NEO4J__URI, NAM_EMBEDDING__MODEL).
settings = MemorySettings(
    neo4j={
        "uri": os.environ["NEO4J_URI"],
        "username": os.environ.get("NEO4J_USERNAME", "neo4j"),
        "password": SecretStr(os.environ["NEO4J_PASSWORD"]),
    },
    embedding={
        "provider": "openai",
        "model": "text-embedding-3-small",
    },
)

memory_client = MemoryClient(settings)

async with memory_client:
    memory = Neo4jMicrosoftMemory.from_memory_client(
        memory_client=memory_client,
        session_id="user-123",
    )
    tools = create_memory_tools(memory)

    async with AzureCliCredential() as credential, Agent(
            client=FoundryChatClient(
            credential=credential,
            project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
            model=os.environ["FOUNDRY_MODEL"],
        ),
        instructions="You are a helpful assistant with persistent memory.",
        tools=tools,
        context_providers=[memory.context_provider],
    ) as agent:
        session = agent.create_session()
        response = await agent.run("Remember that I prefer window seats on flights.", session=session)

Kluczowe funkcje

  • Dwukierunkowe: automatycznie pobiera odpowiedni kontekst przed wywołaniem i zapisuje nowe wspomnienia po odpowiedziach
  • Wyodrębnianie jednostek: tworzy wykres wiedzy z konwersacji przy użyciu potoku wyodrębniania wieloetapowego
  • Uczenie preferencji: wnioskowanie i przechowywanie preferencji użytkownika między sesjami
  • Narzędzia pamięci: Agenci mogą jawnie wyszukiwać pamięć, pamiętać preferencje i znajdować połączenia jednostek

Zasoby

Uwaga / Notatka

Obsługa tej funkcji w języku Go będzie dostępna wkrótce. Aktualny status znajdziesz w repozytorium Agent Framework dla Go.

Następne kroki