Neo4j

Neo4j admite dos patrones distintos del proveedor de contexto de Agent Framework. Comparten una base de datos de grafos, pero usan paquetes independientes y flujos de datos.

Pattern Comportamiento
GraphRAG Busca en un grafo de conocimiento indexado existente mediante recuperación vectorial, de texto completo o híbrida, y puede recorrer entidades relacionadas con Cypher.
Memoria persistente Extrae entidades, hechos, preferencias y razonamiento de conversaciones y crea un gráfico de conocimiento que se puede recuperar entre sesiones.

GraphRAG a partir de un grafo de conocimiento existente

El proveedor de contexto Neo4j GraphRAG añade capacidades de Generación Aumentada de Recuperación (RAG) a los agentes de Agent Framework utilizando un grafo de conocimiento Neo4j. Admite modos de búsqueda vectorial, de texto completo e híbrido, con recorridos de grafos opcionales para enriquecer los resultados con entidades relacionadas a través de consultas de Cypher personalizadas.

Para ver otros servicios de recuperación administrados, consulte Búsqueda de Azure AI y Microsoft Foundry.

En escenarios de gráfico de conocimiento en los que las relaciones entre entidades son importantes, este proveedor recupera subgráficos pertinentes en lugar de fragmentos de texto aislados, lo que proporciona a los agentes un contexto más completo para generar respuestas.

¿Por qué usar Neo4j para GraphRAG?

  • Recuperación mejorada del grafo: la búsqueda vectorial estándar devuelve fragmentos aislados; el recorrido del grafo sigue las conexiones a entidades relacionadas con la superficie, lo que proporciona a los agentes un contexto más completo.
  • Modos de búsqueda flexibles: combine la similitud de vectores, la palabra clave/BM25 y el recorrido de grafos en una sola consulta.
  • Consultas de recuperación personalizadas: las consultas de Cypher permiten controlar exactamente qué relaciones se deben recorrer y qué contexto devolver.

Prerequisites

  • Una instancia neo4j (autohospedado o Neo4j AuraDB) con un índice de vector o texto completo configurado
  • Un proyecto de Fundición de IA de Azure con un modelo de chat implementado y un modelo de inserción (por ejemplo, text-embedding-3-small)
  • Conjunto de variables de entorno: NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD, , AZURE_AI_SERVICES_ENDPOINT, AZURE_AI_EMBEDDING_NAME
  • Credenciales de la CLI de Azure configuradas (az login)
  • .NET 8.0 o posterior

Installation

dotnet add package Neo4j.AgentFramework.GraphRAG

Usage

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.OpenAI;
using Microsoft.Extensions.AI;
using Neo4j.AgentFramework.GraphRAG;
using Neo4j.Driver;

// Read connection details from environment variables
var neo4jSettings = new Neo4jSettings();
var azureEndpoint = Environment.GetEnvironmentVariable("AZURE_AI_SERVICES_ENDPOINT")!;

// Create embedding generator
var credential = new DefaultAzureCredential();
var azureClient = new AzureOpenAIClient(new Uri(azureEndpoint), credential);

IEmbeddingGenerator<string, Embedding<float>> embedder = azureClient
    .GetEmbeddingClient("text-embedding-3-small")
    .AsIEmbeddingGenerator();

// Create Neo4j driver
await using var driver = GraphDatabase.Driver(
    neo4jSettings.Uri, AuthTokens.Basic(neo4jSettings.Username, neo4jSettings.Password!));

// Create the Neo4j context provider
await using var provider = new Neo4jContextProvider(driver, new Neo4jContextProviderOptions
{
    IndexName = "chunkEmbeddings",
    IndexType = IndexType.Vector,
    EmbeddingGenerator = embedder,
    TopK = 5,
    RetrievalQuery = """
        MATCH (node)-[:FROM_DOCUMENT]->(doc:Document)
        OPTIONAL MATCH (doc)<-[:FILED]-(company:Company)
        RETURN node.text AS text, score, doc.title AS title, company.name AS company
        ORDER BY score DESC
        """,
});

// Create an agent with the provider
AIAgent agent = azureClient
    .GetChatClient("gpt-4o")
    .AsIChatClient()
    .AsBuilder()
    .UseAIContextProviders(provider)
    .BuildAIAgent(new ChatClientAgentOptions
    {
        ChatOptions = new ChatOptions
        {
            Instructions = "You are a financial analyst assistant.",
        },
    });

var session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("What risks does Acme Corp face?", session));

Características clave

  • Impulsado por índices: funciona con cualquier índice vectorial o de texto completo de Neo4j
  • Recorrido del grafo: consultas Cypher personalizadas enriquecen los resultados de búsqueda con entidades relacionadas
  • Modos de búsqueda: Vector (similitud semántica), texto completo (palabra clave/BM25) o híbrido (ambos combinados)

Resources

Prerequisites

  • Una instancia neo4j (autohospedado o Neo4j AuraDB) con un índice de vector o texto completo configurado
  • Un proyecto de Fundición de IA de Azure con un modelo de chat implementado y un modelo de inserción (por ejemplo, text-embedding-ada-002)
  • Conjunto de variables de entorno: NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD, FOUNDRY_PROJECT_ENDPOINT, , , FOUNDRY_MODELAZURE_AI_EMBEDDING_NAME
  • Credenciales de la CLI de Azure configuradas (az login)
  • Python 3.10 o posterior

Installation

pip install agent-framework-neo4j

Usage

import os

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from agent_framework_neo4j import Neo4jContextProvider, Neo4jSettings, AzureAISettings, AzureAIEmbedder
from azure.identity import DefaultAzureCredential
from azure.identity.aio import AzureCliCredential

# Reads NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD from environment variables
neo4j_settings = Neo4jSettings()

# Reads FOUNDRY_PROJECT_ENDPOINT, AZURE_AI_EMBEDDING_NAME from environment variables
azure_settings = AzureAISettings()

sync_credential = DefaultAzureCredential()
embedder = AzureAIEmbedder(
    endpoint=azure_settings.inference_endpoint,
    credential=sync_credential,
    model=azure_settings.embedding_model,
)

neo4j_provider = Neo4jContextProvider(
    uri=neo4j_settings.uri,
    username=neo4j_settings.username,
    password=neo4j_settings.get_password(),
    index_name=neo4j_settings.vector_index_name,
    index_type="vector",
    embedder=embedder,
    top_k=5,
    retrieval_query="""
        MATCH (node)-[:FROM_DOCUMENT]->(doc:Document)
        OPTIONAL MATCH (doc)<-[:FILED]-(company:Company)
        RETURN node.text AS text, score, doc.title AS title, company.name AS company
        ORDER BY score DESC
    """,
)

async with (
    neo4j_provider,
    AzureCliCredential() as credential,
    Agent(
        client=FoundryChatClient(
            credential=credential,
            project_endpoint=azure_settings.project_endpoint,
            model=os.environ["FOUNDRY_MODEL"],
        ),
        instructions="You are a financial analyst assistant.",
        context_providers=[neo4j_provider],
    ) as agent,
):
    session = agent.create_session()
    response = await agent.run("What risks does Acme Corp face?", session=session)

Características clave

  • Impulsado por índices: funciona con cualquier índice vectorial o de texto completo de Neo4j
  • Recorrido del grafo: consultas Cypher personalizadas enriquecen los resultados de búsqueda con entidades relacionadas
  • Modos de búsqueda: Vector (similitud semántica), texto completo (palabra clave/BM25) o híbrido (ambos combinados)

Resources

Note

La compatibilidad con go para esta característica estará disponible próximamente. Consulte el repositorio de Agent Framework Go para obtener el estado más reciente.

Memoria persistente del agente

Las integraciones de memoria Neo4j almacenan y recuperan interacciones del agente, extraen automáticamente entidades y crean un grafo de conocimiento a lo largo del tiempo.

Los proveedores administran:

  • Memoria a corto plazo: historial de conversaciones y contexto reciente.
  • Memoria a largo plazo: Entidades, preferencias y hechos extraídos de interacciones.
  • Memoria de razonamiento: seguimientos de razonamiento pasados y patrones de uso de herramientas.

¿Por qué usar Neo4j para la memoria del agente?

  • Persistencia del gráfico de conocimiento: los recuerdos se almacenan como entidades conectadas, no registros planos, por lo que el agente puede razonar sobre las relaciones entre la información recordada.
  • Extracción automática de entidades: las conversaciones se analizan en entidades estructuradas y relaciones sin un esquema definido manualmente.
  • Recuperación entre sesiones: las preferencias, los hechos y las trazas de razonamiento persisten entre sesiones y se ponen de manifiesto a través de los proveedores de contexto.

Note

El paquete .NET (AgentMemory) es un puerto .NET independiente y mantenido por la comunidad del proveedor de memoria neo4j Labs. No es un paquete oficial de Neo4j Labs. Consulte el repositorio AgentMemory (.NET) para obtener información sobre el origen y los detalles.

Prerequisites

  • Una instancia de Neo4j (autoalojada o Neo4j AuraDB).
  • Una implementación de Azure OpenAI o de Microsoft Foundry con un modelo de chat y un modelo de inserciones.
  • Variables de entorno establecidas: NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD, . AZURE_OPENAI_ENDPOINT
  • credenciales de CLI de Azure configuradas (az login) o una clave de API.
  • .NET 8.0 o posterior.

Installation

dotnet add package AgentMemory
dotnet add package AgentMemory.AgentFramework

Usage

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);

Características clave

  • Bidireccional: Neo4jMemoryContextProvider recupera la memoria pertinente antes de cada ejecución y conserva la nueva memoria después de ella.
  • Extracción de entidades: la canalización de extracción configurable crea un gráfico de conocimiento a partir de conversaciones.
  • Aprendizaje de preferencias: Las preferencias, los hechos y las entidades pueden ser recordados por un nuevo AgentSession para el mismo usuario.
  • Herramientas de memoria: MemoryToolFactory expone instancias para operaciones explícitas AIFunction de búsqueda, recordar y recuperar.
  • La inyección de dependencias, ante todo: AddNeo4jAgentMemory y AddAgentMemoryFramework se integran con Generic Host y las aplicaciones de ASP.NET Core.
  • Beyond Agent Framework: la misma biblioteca también se integra con clientes de Kernel semántico y MCP e incluye observabilidad de OpenTelemetry.

Resources

Prerequisites

  • Una instancia de Neo4j (alojada en servidores propios o Neo4j AuraDB).
  • Un proyecto de Microsoft Foundry con un modelo de chat implementado.
  • Una clave de API de OpenAI o Azure implementación de OpenAI para incrustaciones y extracción de entidades.
  • Variables de entorno establecidas: NEO4J_URI, NEO4J_PASSWORD, FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL, . OPENAI_API_KEY
  • CLI de Azure credenciales configuradas (az login).
  • Python 3.10 o posterior.

Installation

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

Usage

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)

Características clave

  • Bidireccional: recupera el contexto pertinente antes de la invocación y guarda nuevos recuerdos después de las respuestas.
  • Extracción de entidades: crea un gráfico de conocimiento a partir de conversaciones con una canalización de extracción de varias fases.
  • Aprendizaje de preferencias: deduce y almacena las preferencias del usuario entre sesiones.
  • Herramientas de memoria: permite a los agentes buscar explícitamente en la memoria, recordar preferencias y encontrar conexiones entre entidades.

Resources

Note

Las integraciones de Neo4j GraphRAG y de memoria no están documentadas actualmente para Agent Framework Go. Consulte el repositorio de Agent Framework Go para obtener el estado más reciente.

Pasos siguientes