Neo4j

O Neo4j dá suporte a dois padrões distintos de provedor de contexto do Agent Framework. Eles compartilham um banco de dados de grafo, mas usam pacotes e fluxos de dados separados.

Pattern Behavior
GraphRAG Pesquisa em um grafo de conhecimento indexado existente usando recuperação vetorial, de texto completo ou híbrida e pode percorrer entidades relacionadas usando Cypher.
Memória persistente Extrai entidades, fatos, preferências e raciocínio de conversas e cria um grafo de conhecimento que pode ser recuperado entre sessões.

GraphRAG a partir de um grafo de conhecimento existente

O Provedor de Contexto do GraphRAG neo4j adiciona funcionalidades de RAG (Geração Aumentada de Recuperação) a agentes do Agent Framework usando um grafo de conhecimento Neo4j. Ele dá suporte a modos de pesquisa vetor, texto completo e híbrido, com passagem de grafo opcional para enriquecer resultados com entidades relacionadas por meio de consultas cypher personalizadas.

Para outros serviços de recuperação gerenciada, consulte Pesquisa de IA do Azure  e Microsoft Foundry.

Para cenários de grafo de conhecimento em que as relações entre entidades importam, esse provedor recupera subgrafos relevantes em vez de partes de texto isoladas, dando aos agentes um contexto mais avançado para gerar respostas.

Por que usar o Neo4j para GraphRAG?

  • Recuperação aprimorada do grafo: a pesquisa de vetor padrão retorna partes isoladas; a passagem de grafo segue conexões com entidades relacionadas à superfície, proporcionando aos agentes um contexto mais avançado.
  • Modos de pesquisa flexíveis: combinar similaridade de vetor, palavra-chave/BM25 e passagem de grafo em uma única consulta.
  • Consultas de recuperação personalizadas: as consultas cypher permitem controlar exatamente quais relações percorrer e qual contexto retornar.

Prerequisites

  • Uma instância neo4j (auto-hospedada ou Neo4j AuraDB) com um vetor ou índice de texto completo configurado
  • Um projeto do Fábrica de IA do Azure com um modelo de chat implantado e um modelo de inserção (por exemplo text-embedding-3-small)
  • Conjunto de variáveis de ambiente: NEO4J_URI, , NEO4J_USERNAME, NEO4J_PASSWORD, AZURE_AI_SERVICES_ENDPOINT, AZURE_AI_EMBEDDING_NAME
  • Credenciais da CLI do Azure configuradas (az login)
  • .NET 8.0 ou 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 principais

  • Controlado por índice: funciona com qualquer vetor Neo4j ou índice de texto completo
  • Travesia de grafo: Consultas Cypher personalizadas enriquecem resultados de pesquisa com entidades relacionadas
  • Modos de pesquisa: Vetor (similaridade semântica), texto completo (palavra-chave/BM25) ou híbrido (ambos combinados)

Resources

Prerequisites

  • Uma instância neo4j (auto-hospedada ou Neo4j AuraDB) com um vetor ou índice de texto completo configurado
  • Um projeto do Fábrica de IA do Azure com um modelo de chat implantado e um modelo de inserção (por exemplo text-embedding-ada-002)
  • Conjunto de variáveis de ambiente: NEO4J_URI, , NEO4J_USERNAME, NEO4J_PASSWORD, FOUNDRY_PROJECT_ENDPOINT, , FOUNDRY_MODEL, AZURE_AI_EMBEDDING_NAME
  • Credenciais da CLI do Azure configuradas (az login)
  • Python 3.10 ou 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 principais

  • Controlado por índice: funciona com qualquer vetor Neo4j ou índice de texto completo
  • Travesia de grafo: Consultas Cypher personalizadas enriquecem resultados de pesquisa com entidades relacionadas
  • Modos de pesquisa: Vetor (similaridade semântica), texto completo (palavra-chave/BM25) ou híbrido (ambos combinados)

Resources

Note

O suporte para Go a este recurso estará disponível em breve. Consulte o repositório Agent Framework Go para obter o status mais recente.

Memória persistente do agente

As integrações de memória neo4j armazenam e recuperam interações do agente, extraindo automaticamente entidades e criando um grafo de conhecimento ao longo do tempo.

Os provedores gerenciam:

  • Memória de curto prazo: histórico de conversas e contexto recente.
  • Memória de longo prazo: entidades, preferências e fatos extraídos das interações.
  • Memória de raciocínio: rastreamentos de raciocínio anteriores e padrões de uso de ferramentas.

Por que usar o Neo4j para memória do agente?

  • Persistência do grafo de conhecimento: as memórias são armazenadas como entidades conectadas, não registros simples, de modo que o agente pode raciocinar sobre relações entre informações lembradas.
  • Extração automática de entidade: as conversas são analisadas em entidades e relações estruturadas sem um esquema definido manualmente.
  • Recuperação entre sessões: preferências, fatos e rastros de raciocínio persistem entre sessões e aparecem por meio de provedores de contexto.

Note

O pacote .NET (AgentMemory) é uma porta de .NET independente mantida pela comunidade do provedor de memória neo4j Labs. Não é um pacote oficial do Neo4j Labs. Consulte o repositório AgentMemory (.NET) para obter a origem e os detalhes.

Prerequisites

  • Uma instância neo4j (auto-hospedada ou Neo4j AuraDB).
  • Uma implantação do Azure OpenAI ou do Microsoft Foundry com um modelo de chat e um modelo de embeddings.
  • Conjunto de variáveis de ambiente: NEO4J_URI, , NEO4J_USERNAME, NEO4J_PASSWORD, AZURE_OPENAI_ENDPOINT.
  • credenciais da CLI do Azure configuradas (az login) ou chave de API.
  • .NET 8.0 ou 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 principais

  • Bidirecional: Neo4jMemoryContextProvider recupera a memória relevante antes de cada execução e salva a nova memória após cada execução.
  • Extração de entidades: o pipeline de extração configurável cria um grafo de conhecimento a partir de conversas.
  • Aprendizado de preferência: preferências, fatos e entidades podem ser lembrados por um novo AgentSession para o mesmo usuário.
  • Ferramentas de memória: MemoryToolFactory expõe instâncias AIFunction para operações explícitas de pesquisa, memória e recall.
  • Prioridade para injeção de dependência: AddNeo4jAgentMemory e AddAgentMemoryFramework se integram a aplicativos do Generic Host e do ASP.NET Core.
  • Além do Agent Framework: a mesma biblioteca também se integra aos clientes Kernel semântico e MCP e inclui a observabilidade do OpenTelemetry.

Resources

Prerequisites

  • Uma instância neo4j (auto-hospedada ou Neo4j AuraDB).
  • Um projeto Microsoft Foundry com um modelo de chat implantado.
  • Uma chave de API da OpenAI ou uma implantação do Azure OpenAI para embeddings e extração de entidades.
  • Conjunto de variáveis de ambiente: NEO4J_URI, , NEO4J_PASSWORD, FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL, OPENAI_API_KEY.
  • Credenciais da CLI do Azure configuradas (az login).
  • Python 3.10 ou 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 principais

  • Bidirecional: recupera o contexto relevante antes da invocação e salva novas memórias após as respostas.
  • Extração de entidades: constrói um grafo de conhecimento a partir de conversas com um pipeline de extração em vários estágios.
  • Aprendizado de preferência: infere e armazena as preferências do usuário entre sessões.
  • Ferramentas de memória: permite que os agentes pesquisem explicitamente a memória, lembrem-se das preferências e encontrem conexões de entidade.

Resources

Note

No momento, o GraphRAG neo4j e as integrações de memória não estão documentados para o Agent Framework Go. Consulte o repositório Agent Framework Go para obter o status mais recente.

Próximas Etapas