Neo4j

Neo4j では、2 つの異なる Agent Framework コンテキスト プロバイダー パターンがサポートされています。 これらはグラフ データベースを共有しますが、個別のパッケージとデータ フローを使用します。

Pattern Behavior
GraphRAG ベクトル、フルテキスト、またはハイブリッド取得を使用して既存のインデックス付きナレッジ グラフを検索し、関連するエンティティを Cypher で走査できます。
永続メモリ 会話からエンティティ、ファクト、基本設定、推論を抽出し、セッション間で呼び戻すことができるナレッジ グラフを構築します。

既存のナレッジグラフを用いたGraphRAG

Neo4j GraphRAG コンテキスト プロバイダーは、Neo4j ナレッジ グラフを使用して、エージェント フレームワーク エージェントに検索拡張生成 (RAG) 機能を追加します。 ベクター、フルテキスト、ハイブリッド検索モードをサポートし、オプションのグラフ トラバーサルを使用して、カスタム のCyher クエリを介して関連エンティティで結果を強化します。

その他のマネージド検索サービスについては、Azure AI 検索 および Microsoft Foundry を参照してください。

エンティティ間のリレーションシップが重要なナレッジ グラフ シナリオの場合、このプロバイダーは分離されたテキスト チャンクではなく関連するサブグラフを取得し、エージェントに応答を生成するための豊富なコンテキストを提供します。

GraphRAG に Neo4j を使用する理由

  • グラフの強化された取得: 標準ベクター検索は分離されたチャンクを返します。グラフ トラバーサルは、サーフェス関連エンティティへの接続に従い、エージェントに豊富なコンテキストを提供します。
  • 柔軟な検索モード: ベクトルの類似性、キーワード/BM25、グラフトラバーサルを 1 つのクエリで結合します。
  • カスタム取得クエリ: Cypher クエリを使用すると、走査するリレーションシップと返すコンテキストを正確に制御できます。

前提条件

  • ベクターまたはフルテキスト インデックスが構成された Neo4j インスタンス (セルフホステッドまたは Neo4j AuraDB)
  • デプロイされたチャット モデルと埋め込みモデルを含む Azure AI Foundry プロジェクト (例: text-embedding-3-small)
  • 環境変数セット: NEO4J_URINEO4J_USERNAMENEO4J_PASSWORDAZURE_AI_SERVICES_ENDPOINTAZURE_AI_EMBEDDING_NAME
  • 構成された Azure CLI 資格情報 (az login)
  • .NET 8.0 以降

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

主要な機能

  • インデックス駆動型: 任意の Neo4j ベクターまたはフルテキスト インデックスで動作します
  • グラフ トラバーサル: カスタム サイファー クエリは、関連するエンティティを使用して検索結果を強化します
  • 検索モード: ベクター (セマンティック類似性)、フルテキスト (キーワード/BM25)、またはハイブリッド (両方を組み合わせたもの)

Resources

前提条件

  • ベクターまたはフルテキスト インデックスが構成された Neo4j インスタンス (セルフホステッドまたは Neo4j AuraDB)
  • デプロイされたチャット モデルと埋め込みモデルを含む Azure AI Foundry プロジェクト (例: text-embedding-ada-002)
  • 環境変数セット: NEO4J_URINEO4J_USERNAMENEO4J_PASSWORDFOUNDRY_PROJECT_ENDPOINTFOUNDRY_MODELAZURE_AI_EMBEDDING_NAME
  • 構成された Azure CLI 資格情報 (az login)
  • Python 3.10 以降

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)

主要な機能

  • インデックス駆動型: 任意の Neo4j ベクターまたはフルテキスト インデックスで動作します
  • グラフ トラバーサル: カスタム サイファー クエリは、関連するエンティティを使用して検索結果を強化します
  • 検索モード: ベクター (セマンティック類似性)、フルテキスト (キーワード/BM25)、またはハイブリッド (両方を組み合わせたもの)

Resources

Note

この機能の Go サポートは近日公開予定です。 最新の状態については、 Agent Framework Go リポジトリ を参照してください。

永続的なエージェントメモリ

Neo4j メモリ統合では、エージェントの相互作用が格納および再現され、エンティティが自動的に抽出され、時間の経過と同時にナレッジ グラフが構築されます。

プロバイダーは次を管理します。

  • 短期メモリ: 会話履歴と最近のコンテキスト。
  • 長期的なメモリ: 相互作用から抽出されたエンティティ、基本設定、ファクト。
  • 推論メモリ: 過去の推論トレースとツールの使用パターン。

エージェント メモリに Neo4j を使用する理由

  • ナレッジ グラフの永続化: メモリはフラット レコードではなく、接続されたエンティティとして格納されるため、エージェントは記憶された情報間の関係を推論できます。
  • エンティティの自動抽出: 会話は、手動で定義されたスキーマなしで構造化されたエンティティとリレーションシップに解析されます。
  • セッション間の呼び戻し: ユーザー設定、ファクト、推論トレースは、セッション間で保持され、コンテキスト プロバイダーを介して表示されます。

Note

.NET パッケージ (AgentMemory) は、Neo4j Labs メモリ プロバイダーのコミュニティが管理する独立した.NET ポートです。 Neo4j Labs の公式パッケージではありません。 ソースと詳細については、AgentMemory (.NET) リポジトリを参照してください。

前提条件

  • Neo4j インスタンス (セルフホステッドまたは Neo4j AuraDB)。
  • チャット モデルと埋め込みモデルを使用した Azure OpenAI または Microsoft Foundry のデプロイ。
  • 環境変数セット: NEO4J_URINEO4J_USERNAMENEO4J_PASSWORDAZURE_OPENAI_ENDPOINT
  • Azure CLI に構成された資格情報 (az login) または API キー。
  • .NET 8.0 以降。

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

主要な機能

  • 双方向: Neo4jMemoryContextProvider は、各実行の前に関連するメモリを呼び出し、その後に新しいメモリを保持します。
  • エンティティ抽出: 構成可能な抽出パイプラインは、会話からナレッジ グラフを構築します。
  • ユーザー設定の学習: ユーザー設定、ファクト、エンティティは、同じユーザーの新しい AgentSession によって呼び出すことができます。
  • メモリ ツール: MemoryToolFactory は、明示的な検索、記憶、および呼び戻し操作のために AIFunction インスタンスを公開します。
  • 依存関係の挿入を最初に行う: AddNeo4jAgentMemoryAddAgentMemoryFramework、汎用ホストおよび ASP.NET Core アプリケーションと統合します。
  • エージェント フレームワークを超えて: 同じライブラリは、Semantic Kernelおよび MCP クライアントとも統合され、OpenTelemetry の可観測性が含まれています。

Resources

前提条件

  • Neo4j インスタンス (セルフホステッドまたは Neo4j AuraDB)。
  • デプロイされたチャット モデルを含む Microsoft Foundry プロジェクト。
  • 埋め込みとエンティティ抽出のための OpenAI API キーまたは Azure OpenAI デプロイ。
  • 環境変数セット: NEO4J_URINEO4J_PASSWORDFOUNDRY_PROJECT_ENDPOINTFOUNDRY_MODELOPENAI_API_KEY
  • Azure CLI の資格情報が構成されています (az login)。
  • Python 3.10 以降。

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)

主要な機能

  • 双方向: 呼び出し前に関連するコンテキストを取得し、応答後に新しいメモリを保存します。
  • エンティティ抽出: マルチステージ抽出パイプラインを使用して、会話からナレッジ グラフを構築します。
  • ユーザー設定の学習: セッション間でユーザー設定を推論して格納します。
  • メモリ ツール: エージェントがメモリを明示的に検索し、基本設定を記憶し、エンティティ接続を見つけることができます。

Resources

Note

Neo4j GraphRAG とメモリ統合は、Agent Framework Go については現在文書化されていません。 最新の状態については、 Agent Framework Go リポジトリ を参照してください。

次のステップ