Tablestore Agent Storage SDK を使用すると、Python と TypeScript で AI エージェントにメモリ ストアとナレッジベースの機能を追加できます。汎用の Tablestore SDK とは異なり、Agent Storage SDK は API キー認証をサポートしており、AccessKey 認証情報を管理する必要がありません。
Tablestore SDK との違い
Agent Storage SDK は Tablestore SDK から独立しており、エージェント ストレージ操作のみを対象としています。次の表に主な違いを示します。
|
項目 |
Tablestore SDK |
Agent Storage SDK |
|
パッケージ |
Python: |
Python: |
|
クライアントクラス |
|
|
|
スコープ |
メモリ ストアを含むすべての Tablestore 操作 |
エージェント ストレージ操作のみ (メモリ ストアとナレッジベース) |
|
認証 |
AccessKey (AK/SK) |
API キーまたは AccessKey (AK/SK) |
インストールと設定
前提条件
HTTPS エンドポイントとインスタンス名を持つ Tablestore インスタンス。
API キー認証を使用する場合:対象のインスタンスで作成された API キー。API キーにバインドされた RAM ユーザーは
ots:CallWithBearerToken権限を持っている必要があり、API キーはそのユーザーのすべての RAM ポリシーを継承します。ナレッジベース機能を使用する場合:ソースドキュメントを保存するための OSS バケット。SDK はドキュメントのアップロードに OSS アクセス認証情報 (AccessKey) を必要とします。クライアントの初期化時に
oss_endpointとoss_bucket_nameを渡します。
インストール
使用する言語のパッケージをインストールします。
Python
pip install tablestore-agent-storage
TypeScript/Node.js
npm install @tablestore/agent-storage
認証
Agent Storage SDK は 2 つの認証方法をサポートしています。
|
方法 |
ユースケース |
サポートされる操作 |
トランスポート |
|
AccessKey (AK/SK) |
テーブル管理やデータ操作を含むフルアクセス |
すべての Tablestore 操作 |
HTTP または HTTPS |
|
API キー |
AccessKey 認証情報を管理しない AI シナリオ向けの軽量な統合 |
メモリ ストアとナレッジベース操作のみ |
HTTPS のみ |
API キーの作成と承認については、「API キー管理」をご参照ください。
クライアントの初期化
ほとんどのエージェントのユースケースでは、API キー認証を使用します。ナレッジベースのドキュメントをアップロードしたり、他の Tablestore 操作にアクセスしたりするには、AccessKey 認証情報と OSS 設定を提供してください。
API キーの使用 (推奨)
api_key パラメーターとインスタンス情報を使用してクライアントを初期化します。エンドポイントは HTTPS を使用する必要があります。
Python
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
api_key="<your-api-key>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
)
resp = client.list_memory_stores({})
for store in resp["stores"]:
print(store["memoryStoreName"])
TypeScript
import { AgentStorageClient } from '@tablestore/agent-storage';
const client = new AgentStorageClient({
apiKey: '<your-api-key>',
endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
instanceName: '<instance-name>',
});
const resp = await client.listMemoryStores({});
for (const store of resp.stores) {
console.log(store.memoryStoreName);
}
cURL
API キーを x-ots-apikey リクエストヘッダーで渡します。
curl -X POST 'https://<instance>.<region>.ots.aliyuncs.com/ListMemoryStores' \
-H 'x-ots-instancename: <instance-name>' \
-H 'x-ots-apikey: <your-api-key>' \
-H 'Content-Type: application/json' \
-d '{}'
AccessKey の使用
すべての Tablestore 操作にアクセスしたり、OSS を介してナレッジベースのドキュメントをアップロードしたりするには、AccessKey 認証を使用します。
Python
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
access_key_id="<AccessKey ID>",
access_key_secret="<AccessKey Secret>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
# ナレッジベース機能を使用するには、OSS も設定します
oss_endpoint="https://oss-<region>.aliyuncs.com",
oss_bucket_name="<bucket-name>",
)
TypeScript
import { AgentStorageClient } from '@tablestore/agent-storage';
const client = new AgentStorageClient({
endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
instanceName: '<instance-name>',
accessKeyId: process.env.OTS_ACCESS_KEY_ID,
accessKeySecret: process.env.OTS_ACCESS_KEY_SECRET,
});
メモリ ストアの例
メモリ ストアは、AI エージェントの複数ターンにわたる会話の記憶を永続化し、ベクトルベースのセマンティック検索をサポートします。SDK のメソッドは REST API の操作に対応しています。Python のメソッドはスネークケース (snake_case) を、TypeScript のメソッドはキャメルケース (camelCase) を使用し、パラメーターは API 仕様と一致します。
Python
# 1. メモリ ストアの作成
client.create_memory_store({
"memoryStoreName": "agent_memory",
"description": "エージェント用の長期メモリ ストア",
"extractInstructions": "ユーザーの食の好みと旅行の習慣に焦点を当てる",
})
# 2. 記憶の書き込み
client.add_memories({
"memoryStoreName": "agent_memory",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001",
},
"messages": [
{"role": "user", "content": "私はアメリカーノコーヒーを飲むのが好きです"},
],
"sync": True,
})
# 3. 記憶の検索
result = client.search_memories({
"memoryStoreName": "agent_memory",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "*",
"runId": "*",
},
"query": "ユーザーはどんな飲み物が好きですか",
"topK": 5,
"includeEvidence": True,
"minSimilarity": 0.3,
})
for hit in result["data"]["memories"]:
print(hit["content"], hit["similarity"])
# 4. メモリ ストアの一覧表示
resp = client.list_memory_stores({})
for store in resp["stores"]:
print(store["memoryStoreName"])
TypeScript
// 1. メモリ ストアの作成
await client.createMemoryStore({
memoryStoreName: 'agent_memory',
description: 'エージェント用の長期メモリ ストア',
});
// 2. 記憶の書き込み
await client.addMemories({
memoryStoreName: 'agent_memory',
scope: {
appId: 'app-001',
tenantId: 'user-001',
agentId: 'assistant',
runId: 'session-001',
},
messages: [{ role: 'user', content: '私はアメリカーノコーヒーを飲むのが好きです' }],
sync: true,
});
// 3. 記憶の検索
const result = await client.searchMemories({
memoryStoreName: 'agent_memory',
scope: { appId: 'app-001', tenantId: 'user-001', agentId: '*', runId: '*' },
query: 'ユーザーはどんな飲み物が好きですか',
topK: 5,
includeEvidence: true,
});
for (const hit of result.data.memories) {
console.log(hit.content, hit.similarity);
}
SDK は、メモリ ストアの更新、メモリ ストアの削除、スコープによる記憶の一覧表示、個々の記憶の取得、非同期タスクのクエリを行うためのメソッドも提供します。「メモリ ストア API リファレンス」には、利用可能なすべての操作とパラメーターが記載されています。
ナレッジベースの例
ナレッジベースは、企業の Q&A や RAG のために、自動的なドキュメントのチャンキング、ベクトル化、およびハイブリッド検索をサポートします。ソースドキュメントは OSS に保存され、Tablestore がチャンクのインデックス作成と取得を処理します。使用前に OSS と Tablestore の両方を設定してください。
埋め込みモデルを指定せずにナレッジベースを作成した場合、SDK は Alibaba Cloud の Model Studio text-embedding-v4 (1024 次元) を使用します。デフォルトでハイブリッド検索が有効になり、ベクトル検索と全文検索が組み合わされます。
Python
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
access_key_id="<AccessKey ID>",
access_key_secret="<AccessKey Secret>",
oss_endpoint="https://oss-<region>.aliyuncs.com",
oss_bucket_name="<bucket-name>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
)
# 1. ナレッジベースの作成 (デフォルトで Model Studio の text-embedding-v4 を使用します。
# デフォルトの取得モードは、ベクトル検索と全文検索を組み合わせたハイブリッド検索です)
client.create_knowledge_base({
"knowledgeBaseName": "product_kb",
"description": "製品ナレッジベース",
})
# 2. ローカルドキュメントのアップロード (SDK は最初にファイルを OSS にアップロードし、その後チャンキングとベクトル化をトリガーします)
client.upload_documents({
"knowledgeBaseName": "product_kb",
"documents": [
{
"documentId": "doc-guide-001",
"filePath": "./docs/product-overview.txt",
},
{
"documentId": "doc-guide-002",
"filePath": "./docs/sdk-intro.txt",
},
],
})
# 3. ナレッジベース内のドキュメントの一覧表示
resp = client.list_documents({
"knowledgeBaseName": "product_kb",
"maxResults": 10,
})
for doc in resp["data"]["documentDetails"]:
print(doc.get("documentId"), doc.get("ossKey"), doc.get("status"))
# 4. 取得
from tablestore_agent_storage.models import RetrieveRequest, RetrievalQuery
req = RetrieveRequest(
knowledge_base_name="product_kb",
retrieval_query=RetrievalQuery(text="Agent Storage SDK は何に使われますか"),
)
result = client.retrieve(req)
for hit in result["data"]["retrievalResults"]:
print(hit)
# 5. ドキュメントの削除
client.delete_documents({
"knowledgeBaseName": "product_kb",
"documents": [{"documentId": "doc-guide-001"}],
})
# 6. ナレッジベースの削除
client.delete_knowledge_base({"knowledgeBaseName": "product_kb"})
TypeScript
import { NodeAgentStorageClient } from '@tablestore/agent-storage/node';
const client = new NodeAgentStorageClient({
accessKeyId: '<AccessKey ID>',
accessKeySecret: '<AccessKey Secret>',
endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
instanceName: '<instance-name>',
ossEndpoint: 'https://oss-<region>.aliyuncs.com',
ossBucketName: '<bucket-name>',
ossAccessKeyId: '<AccessKey ID>',
ossAccessKeySecret: '<AccessKey Secret>',
});
// 1. ナレッジベースの作成 (デフォルトで Model Studio の text-embedding-v4 を使用します。
// デフォルトの取得モードは、ベクトル検索と全文検索を組み合わせたハイブリッド検索です)
await client.createKnowledgeBase({
knowledgeBaseName: 'product_kb',
description: '製品ナレッジベース',
});
// 2. ローカルドキュメントのアップロード (SDK は最初にファイルを OSS にアップロードし、その後チャンキングとベクトル化をトリガーします)
// TypeScript SDK はアップロード時にサーバー側で docId を生成し、カスタム documentId は受け付けません
await client.uploadDocuments({
knowledgeBaseName: 'product_kb',
documents: [
{ filePath: './docs/product-overview.txt' },
{ filePath: './docs/sdk-intro.txt' },
],
});
// 3. ナレッジベース内のドキュメントの一覧表示
const resp = await client.listDocuments({
knowledgeBaseName: 'product_kb',
maxResults: 10,
});
for (const doc of resp.data.documentDetails) {
console.log(doc.docId, doc.ossKey, doc.status);
}
// 4. 取得
const result = await client.retrieve({
knowledgeBaseName: 'product_kb',
retrievalQuery: { text: 'Agent Storage SDK は何に使われますか' },
});
for (const hit of result.data.retrievalResults) {
console.log(hit);
}
// 5. ドキュメントの削除 (TypeScript では、前のステップで返された ossKey を使用して削除するドキュメントを指定する必要があります)
await client.deleteDocuments({
knowledgeBaseName: 'product_kb',
documents: [{ ossKey: '<oss-key-from-list>' }],
});
// 6. ナレッジベースの削除
await client.deleteKnowledgeBase({ knowledgeBaseName: 'product_kb' });
ドキュメントのチャンキングとベクトル化は、アップロード後に非同期で実行されます。status フィールドを list_documents (TypeScript: listDocuments) でクエリして、インデックス作成の進捗状況を確認してください。