すべてのプロダクト
Search
ドキュメントセンター

:AnalyticDB for PostgreSQL 長期記憶高度機能ガイド

最終更新日:Mar 31, 2026

本ガイドは、AnalyticDB for PostgreSQL の長期記憶の基本機能を既に理解している開発者向けに、高度な機能について解説します。すべての機能は、adbpg_llm_memory スキーマ内のユーザー定義関数(UDF)として実装されています。

解説内容:

メモリコンテンツの処理

有効期限の設定

adbpg_llm_memory.add()meta パラメーターに expiration_date を指定すると、指定日時に自動的にメモリが有効期限切れになります。有効期限が切れたメモリは、以降のすべての取得処理から除外されます。

-- このメモリは 2025 年 11 月 30 日に有効期限切れとなり、2025 年 12 月 1 日以降には再現されません。
SELECT adbpg_llm_memory.add($$
[
  {"role": "user", "content": "今週末に北京へ旅行します"}
]
$$, 'test_u', null, null, $${"expiration_date": "2025-11-30"}$$, null, null);

メモリコンテンツの更新

adbpg_llm_memory.update() を使用して、ID を指定して既存のメモリのコンテンツを置き換えます。これは、LLM によって抽出されたコンテンツが、実際に保存したい内容と正確に一致しない場合に有効です。

バージョン要件: 7.2.1.9 以降

SELECT adbpg_llm_memory.update(
  'b55a108f-f073-4d48-87ec-2ffc18603e3d',
  'コーヒーを好む'
);

パラメーター:

パラメーター 説明
memory_id TEXT 更新対象のメモリの ID
new_content TEXT 置き換えるコンテンツ

LLM 抽出を経ないメモリのインポート

adbpg_llm_memory.add()infer => 'false' を設定すると、大規模言語モデル(LLM)による抽出ステップをスキップし、メモリコンテンツを直接保存できます。これは、コンテンツがすでに外部で処理済みである場合に有用です。

バージョン要件: 7.2.1.10 以降

SELECT adbpg_llm_memory.add($$
[
  {"role": "user", "content": "今週末に北京へ旅行します"}
]
$$, 'test_u', infer => 'false');

事実抽出プロンプトのカスタマイズ

adbpg_llm_memory.config()custom_fact_extraction_prompt を設定することで、会話から事実を抽出する方法を制御できます。

重要

プロンプトでは、モデルに対して {"facts": ["fact1", "fact2", ...]} の JSON 形式での出力を明示的に指示する必要があります。その他の形式で出力した場合、抽出は失敗します。

プロンプト構成のガイドライン:

  1. 許容される事実の種類を明示的に記述します。

  2. 実際の運用メッセージのスタイルに合った短い例を含めます。

  3. 出力が埋め込まれた例と空の出力例({"facts": []})の両方を示します。

  4. モデルに対して、facts キーのみを含む JSON を返すよう指示します。

  • 例:

    SELECT adbpg_llm_memory.config(
    $$
    {
      "llm": {
        "provider": "qwen",
        "config": {
          "model": "qwen3-32b",
          "qwen_base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
          "api_key": "sk-xxxxxxx"
        }
      },
      "embedder": {
        "provider": "openai",
        "config": {
          "model": "text-embedding-v4",
          "api_key": "sk-xxxxxx",
          "embedding_dims": "1536",
          "openai_base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
        }
      },
      "vector_store": {
        "provider": "adbpg",
        "config": {
          "user": "username",
          "dbname": "postgres",
          "hnsw": "True",
          "port": "xx",
          "embedding_model_dims": "1536"
        }
      },
      "custom_fact_extraction_prompt": "<your-custom-prompt>"
    }
    $$
    );
  • メモリカテゴリの管理

    adbpg_llm_memory.add() は、保存するすべてのメモリに自動的にカテゴリタグを適用します。

    バージョン要件: 7.2.1.8 以降

    デフォルトカテゴリ: personal_detailstravelfood など。

    独自のカテゴリ体系を定義するには、adbpg_llm_memory.set_custom_category() を呼び出します。この操作は、デフォルトカテゴリを**完全に上書き**します。この呼び出し後に追加されたメモリは、ご自身で定義したカスタムカテゴリのみを使用します。

    -- カスタムカテゴリの設定(システムデフォルトを上書き)。
    SELECT adbpg_llm_memory.set_custom_category($$[
      {
        "product_inquiry": "製品の機能、価格、可用性、互換性に関するユーザーの質問を記録"
      },
      {
        "technical_support": "インストール、エラー、バグ、ソフトウェア/ハードウェアの使用に関する問題を記録"
      },
      {
        "account_management": "課金、サブスクリプション、ログイン問題、プロファイル更新に関するリクエストを記録"
      },
      {
        "feedback_and_suggestions": "ユーザーからのフィードバック、新機能の要望、使いやすさ向上のアイデアを記録"
      },
      {
        "onboarding_assistance": "初期セットアップ、チュートリアルの依頼、開始時のガイダンスに関するユーザーのニーズを記録"
      }
    ]$$);
    
    -- 現在のカテゴリ構成を取得。
    SELECT adbpg_llm_memory.get_custom_category();

    メモリの取得およびフィルタリング

    構造化条件によるメモリのフィルタリング

    adbpg_llm_memory.search()filter JSON オブジェクトを渡すことで、特定のフィールドに基づいて結果を絞り込めます。フィルターでは、ANDORNOT を用いた複合論理がサポートされます。

    エンティティフィールド:

    フィールド 演算子
    user_id 完全に一致 {"user_id": "user_123"}
    agent_id 完全に一致 {"agent_id": "travel1"}
    run_id 完全に一致 {"run_id": "run_001"}

    時刻フィールド:

    フィールド 演算子
    created_at gtelte {"created_at": {"gte": "2025-07-29", "lte": "2025-07-30"}}

    コンテンツフィールド:

    フィールド 演算子
    metadata ANDORNOTcontainsin* {"categories": {"contains": "food"}}

    例 1:エージェントおよび期間によるフィルタリング

    SELECT adbpg_llm_memory.search(
      '週末旅行に適した場所をおすすめしてください',
      'test_u',
      null,
      null,
      $$
      {
        "AND": [
          {"created_at": {"gte": "2025-07-29", "lte": "2025-07-30"}},
          {"agent_id": "travel1"}
        ]
      }
      $$
    );

    例 2:メタデータフィールドによるフィルタリング

    -- categories フィールドは、adbpg_llm_memory.add() 呼び出し時の meta パラメーターで設定されます。
    SELECT adbpg_llm_memory.search(
      '私について何が分かっていますか?',
      'test_u',
      null,
      null,
      $$
      {
        "AND": [
          {"categories": {"contains": "food"}}
        ]
      }
      $$
    );

    結果件数の制限

    search() が返すメモリの件数を制御するには、limits パラメーターを設定します。デフォルト値は 10 です。

    バージョン要件: 7.2.1.7 以降

    -- 最も関連性の高い上位 5 件のメモリのみを返します。
    SELECT adbpg_llm_memory.search(
      '週末旅行に適した場所をおすすめしてください',
      'test_u',
      null,
      null,
      $$
      {
        "AND": [
          {"created_at": {"gte": "2025-07-29", "lte": "2025-07-30"}},
          {"agent_id": "travel1"}
        ]
      }
      $$,
      5
    );

    類似度しきい値の設定

    threshold パラメーター(0.0 ~ 1.0 の FLOAT 値)を設定すると、最小類似度スコアを下回るメモリを除外できます。しきい値を超えるスコアを持つメモリのみが返されます。

    バージョン要件: 7.2.1.9 以降

    -- 類似度スコアが 0.4 を超えるメモリのみを返します。
    SELECT adbpg_llm_memory.search(
      query => '私について何が分かっていますか?',
      user_id => 'test_u',
      threshold => 0.4
    );

    再ランキングの有効化

    adbpg_llm_memory.config()reranker セクションを追加すると、ベクター取得後に再ランキングモデルを適用して、二次的なソートを行えます。再ランキングにより結果の関連性が向上し、再ランキングスコアは rerank_score フィールドで返されます。

    バージョン要件: 7.2.1.9 以降

    サポートされているモデル: Qwen シリーズのリランクモデル(テキスト リランク API を参照)

    再ランキングは各検索リクエストにレイテンシーを追加します。特にユーザー向けリアルタイムアプリケーションでは、本番環境への導入前に、ご自身の環境におけるレイテンシーへの影響をテストしてください。
  • 例:

    -- 長期記憶の構成時に、再ランキングモデルに関する情報を追加します。現在は Qwen シリーズの再ランキングモデルのみがサポートされています。
    SELECT adbpg_llm_memory.config(
    $$
    {
      "llm": {
        "provider": "qwen",
        "config": {
          "model": "qwen3-32b",
          "qwen_base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
          "api_key": "sk-xxxxxxx"
        }
      },
      "embedder": {
        "provider": "openai",
        "config": {
          "model": "text-embedding-v3",
          "api_key": "sk-xxxxxx",
          "embedding_dims": "1536",
          "openai_base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
        }
      },
      "vector_store": {
        "provider": "adbpg",
        "config": {
          "user": "username",
          "dbname": "postgres",
          "hnsw": "True",
          "embedding_model_dims": "1536"
        }
      },
      "reranker": {
            "provider": "qwen",
            "config": {
                "model": "qwen3-rerank",
                "api_key": "sk-xxxx",
                "top_k": 2  -- 上位 2 件の結果を返します。
            }
      }
    }
    $$
    );
  • top_k は、再ランキング後に返される最大結果件数を制御します。上記の例では、最大 2 件の結果が返されます。

    メモリのモニタリングおよび監査

    メモリ操作履歴の追跡

    監査およびデバッグ目的で、すべてのメモリ操作(読み取り、書き込み、削除)を記録する履歴追跡機能を有効化できます。

    バージョン要件: 7.2.1.9 以降

    adbpg_llm_memory.config()trace フィールドを、以下のいずれかの値に設定します:

    レコード
    None(デフォルト) 操作なし
    read 取得操作のみ
    write 追加、更新、削除操作のみ
    all すべての操作

    履歴追跡の有効化:

  • 例:

    -- 履歴操作の記録を有効化または無効化する構成を設定します。
    SELECT adbpg_llm_memory.config(
    $$
    {
      "llm": {
        "provider": "qwen",
        "config": {
          "model": "qwen3-32b",
          "qwen_base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
          "api_key": "sk-xxxxxxx"
        }
      },
      "embedder": {
        "provider": "openai",
        "config": {
          "model": "text-embedding-v3",
          "api_key": "sk-xxxxxx",
          "embedding_dims": "1536",
          "openai_base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
        }
      },
      "vector_store": {
        "provider": "adbpg",
        "config": {
          "user": "username",
          "dbname": "postgres",
          "hnsw": "True",
          "embedding_model_dims": "1536"
        }
      },
      "trace": "all"
    $$
    );
    ```
    
    -- メモリの履歴操作を表示します。パラメーターはメモリ ID です。
    SELECT adbpg_llm_memory.get_history('b55a108f-f073-4d48-87ec-2ffc18603e3d');
    
    -- 特定のメモリの履歴を削除します。パラメーターはメモリ ID です。
    SELECT adbpg_llm_memory.delete_history('b55a108f-f073-4d48-87ec-2ffc18603e3d');
    
    -- すべてのメモリ履歴を削除します。
    SELECT adbpg_llm_memory.delete_all_history();
    
    -- メモリ履歴操作が占有するディスク領域を取得します。
    SELECT adbpg_llm_memory.history_size();
    
  • 履歴レコードの管理:

    -- 特定のメモリの操作履歴を取得します。
    SELECT adbpg_llm_memory.get_history('b55a108f-f073-4d48-87ec-2ffc18603e3d');
    
    -- 特定のメモリの履歴を削除します。
    SELECT adbpg_llm_memory.delete_history('b55a108f-f073-4d48-87ec-2ffc18603e3d');
    
    -- すべての履歴レコードを削除します。
    SELECT adbpg_llm_memory.delete_all_history();
    
    -- 履歴レコードが使用するディスク領域を確認します。
    SELECT adbpg_llm_memory.history_size();

    メモリのディスク使用量の確認

    adbpg_llm_memory.memory_size() を呼び出すと、すべての長期記憶データが使用する総ディスク領域を取得できます。

    バージョン要件: 7.2.1.9 以降

    SELECT adbpg_llm_memory.memory_size();