本ガイドは、AnalyticDB for PostgreSQL の長期記憶の基本機能を既に理解している開発者向けに、高度な機能について解説します。すべての機能は、adbpg_llm_memory スキーマ内のユーザー定義関数(UDF)として実装されています。
解説内容:
-
メモリコンテンツの処理:有効期限の設定、コンテンツの更新、大規模言語モデル(LLM)による抽出のスキップ、事実抽出プロンプトのカスタマイズ
-
メモリカテゴリの管理:メモリに適用されるカテゴリタグの管理およびカスタマイズ
-
メモリの取得およびフィルタリング:構造化フィルターの適用、結果件数の制限、類似度しきい値の設定、再ランキングの有効化
-
メモリのモニタリングおよび監査:操作履歴の追跡、ディスク使用量の確認
メモリコンテンツの処理
有効期限の設定
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 形式での出力を明示的に指示する必要があります。その他の形式で出力した場合、抽出は失敗します。
プロンプト構成のガイドライン:
-
許容される事実の種類を明示的に記述します。
-
実際の運用メッセージのスタイルに合った短い例を含めます。
-
出力が埋め込まれた例と空の出力例(
{"facts": []})の両方を示します。 -
モデルに対して、
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_details、travel、food など。
独自のカテゴリ体系を定義するには、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 オブジェクトを渡すことで、特定のフィールドに基づいて結果を絞り込めます。フィルターでは、AND、OR、NOT を用いた複合論理がサポートされます。
エンティティフィールド:
| フィールド | 演算子 | 例 |
|---|---|---|
user_id |
完全に一致 | {"user_id": "user_123"} |
agent_id |
完全に一致 | {"agent_id": "travel1"} |
run_id |
完全に一致 | {"run_id": "run_001"} |
時刻フィールド:
| フィールド | 演算子 | 例 |
|---|---|---|
created_at |
gte、lte |
{"created_at": {"gte": "2025-07-29", "lte": "2025-07-30"}} |
コンテンツフィールド:
| フィールド | 演算子 | 例 |
|---|---|---|
metadata |
AND、OR、NOT、contains、in、* |
{"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();