意味的類似性によるベクターストア文書の検索
セマンティック類似性とバッチ操作を使用してベクトルストアのドキュメントを検索する
例リクエスト
curl -X GET \
"https://api.rememberizer.ai/api/v1/vector-stores/vs_abc123/documents/search?q=How%20to%20integrate%20our%20product%20with%20third-party%20systems&n=5&prev_chunks=1&next_chunks=1" \
-H "x-api-key: YOUR_API_KEY"const searchVectorStore = async (vectorStoreId, query, numResults = 5, prevChunks = 1, nextChunks = 1) => {
const url = new URL(`https://api.rememberizer.ai/api/v1/vector-stores/${vectorStoreId}/documents/search`);
url.searchParams.append('q', query);
url.searchParams.append('n', numResults);
url.searchParams.append('prev_chunks', prevChunks);
url.searchParams.append('next_chunks', nextChunks);
const response = await fetch(url.toString(), {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY'
}
});
const data = await response.json();
console.log(data);
};
searchVectorStore(
'vs_abc123',
'How to integrate our product with third-party systems',
5,
1,
1
);import requests
def search_vector_store(vector_store_id, query, num_results=5, prev_chunks=1, next_chunks=1):
headers = {
"x-api-key": "YOUR_API_KEY"
}
params = {
"q": query,
"n": num_results,
"prev_chunks": prev_chunks,
"next_chunks": next_chunks
}
response = requests.get(
f"https://api.rememberizer.ai/api/v1/vector-stores/{vector_store_id}/documents/search",
headers=headers,
params=params
)
data = response.json()
print(data)
search_vector_store(
'vs_abc123',
'How to integrate our product with third-party systems',
5,
1,
1
)require 'net/http'
require 'uri'
require 'json'
def search_vector_store(vector_store_id, query, num_results=5, prev_chunks=1, next_chunks=1)
uri = URI("https://api.rememberizer.ai/api/v1/vector-stores/#{vector_store_id}/documents/search")
params = {
q: query,
n: num_results,
prev_chunks: prev_chunks,
next_chunks: next_chunks
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['x-api-key'] = 'YOUR_API_KEY'
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
response = http.request(request)
data = JSON.parse(response.body)
puts data
end
search_vector_store(
'vs_abc123',
'How to integrate our product with third-party systems',
5,
1,
1
)パスパラメータ
vector-store-id
string
必須。 検索するベクトルストアのID。
クエリパラメータ
q
文字列
必須。 検索クエリテキスト。
n
整数
返す結果の数。デフォルト: 10。
t
数値
一致の閾値。デフォルト: 0.7。
prev_chunks
整数
一致したチャンクの前に含めるチャンクの数。デフォルト: 0。
next_chunks
整数
一致したチャンクの後に含めるチャンクの数。デフォルト: 0。
レスポンスフォーマット
{
"vector_store": {
"id": "vs_abc123",
"name": "製品ドキュメント"
},
"matched_chunks": [
{
"document": {
"id": 1234,
"name": "統合ガイド.pdf",
"type": "application/pdf",
"size": 250000,
"indexed_on": "2023-06-15T10:30:00Z",
"vector_store": "vs_abc123",
"created": "2023-06-15T10:15:00Z",
"modified": "2023-06-15T10:30:00Z"
},
"matched_content": "私たちの製品は、サードパーティシステム向けにいくつかの統合オプションを提供しています。主な方法は、OAuth2認証をサポートするRESTful APIを通じてです。さらに、Python、JavaScript、Javaで利用可能なSDKを使用することもできます。",
"distance": 0.123
},
// ... さらに一致したチャンク
]
}認証
このエンドポイントは、x-api-key ヘッダーを使用して API キーによる認証を必要とします。
エラーレスポンス
400
不正なリクエスト - 必須パラメータが欠落しているか、無効な形式
401
認証エラー - 無効または欠落したAPIキー
404
未検出 - ベクトルストアが見つかりません
500
サーバ内部エラー
検索最適化のヒント
コンテキストウィンドウ
prev_chunks と next_chunks パラメータを使用して、各一致に含まれるコンテキストの量を制御します:
両方を 0 に設定すると、コンテキストなしの正確な一致になります
両方を 1-2 に設定すると、最小限のコンテキストを持つ一致になります
両方を 3-5 に設定すると、 substantial context を持つ一致になります
一致の閾値
t パラメータは、一致がどのように厳密にフィルタリングされるかを制御します:
高い値(例:0.9)は、非常に近い一致のみを返します
低い値(例:0.5)は、より多様な一致を返します
デフォルト(0.7)は、バランスの取れたアプローチを提供します
バッチ操作
高スループットアプリケーション向けに、Rememberizerはベクトルストアに対する効率的なバッチ操作をサポートしています。これらのメソッドは、複数の検索クエリを処理する際のパフォーマンスを最適化します。
バッチ検索の実装
import requests
import time
import concurrent.futures
def batch_search_vector_store(vector_store_id, queries, num_results=5, batch_size=10):
"""
ベクトルストアに対してバッチ検索を実行します
引数:
vector_store_id: 検索するベクトルストアのID
queries: 検索クエリ文字列のリスト
num_results: クエリごとの結果の数
batch_size: 並列リクエストの数
戻り値:
検索結果のリスト
"""
headers = {
"x-api-key": "YOUR_API_KEY"
}
results = []
# APIを圧倒しないようにバッチで処理します
for i in range(0, len(queries), batch_size):
batch_queries = queries[i:i+batch_size]
with concurrent.futures.ThreadPoolExecutor(max_workers=batch_size) as executor:
futures = []
for query in batch_queries:
params = {
"q": query,
"n": num_results,
"prev_chunks": 1,
"next_chunks": 1
}
# スレッドプールにリクエストを送信します
future = executor.submit(
requests.get,
f"https://api.rememberizer.ai/api/v1/vector-stores/{vector_store_id}/documents/search",
headers=headers,
params=params
)
futures.append(future)
# すべてのfutureから結果を収集します
for future in futures:
response = future.result()
if response.status_code == 200:
results.append(response.json())
else:
results.append({"error": f"ステータスコードで失敗しました: {response.status_code}"})
# レート制限を避けるためにバッチ間に遅延を追加します
if i + batch_size < len(queries):
time.sleep(1)
return results
# 使用例
queries = [
"REST APIとの統合",
"認証プロトコル",
"本番環境へのデプロイ方法",
"パフォーマンス最適化技術",
"エラーハンドリングのベストプラクティス"
]
search_results = batch_search_vector_store("vs_abc123", queries, num_results=3, batch_size=5)/**
* ベクトルストアに対してバッチ検索を実行する
*
* @param {string} vectorStoreId - ベクトルストアのID
* @param {string[]} queries - 検索クエリのリスト
* @param {Object} options - 設定オプション
* @returns {Promise<Array>} - 検索結果のリスト
*/
async function batchSearchVectorStore(vectorStoreId, queries, options = {}) {
const {
numResults = 5,
batchSize = 10,
delayBetweenBatches = 1000,
prevChunks = 1,
nextChunks = 1,
distanceThreshold = 0.7
} = options;
const results = [];
const apiKey = 'YOUR_API_KEY';
// APIの負荷を管理するためにバッチ処理を行う
for (let i = 0; i < queries.length; i += batchSize) {
const batchQueries = queries.slice(i, i + batchSize);
// 並列リクエストのためのプロミス配列を作成
const batchPromises = batchQueries.map(query => {
const url = new URL(`https://api.rememberizer.ai/api/v1/vector-stores/${vectorStoreId}/documents/search`);
url.searchParams.append('q', query);
url.searchParams.append('n', numResults);
url.searchParams.append('prev_chunks', prevChunks);
url.searchParams.append('next_chunks', nextChunks);
url.searchParams.append('t', distanceThreshold);
return fetch(url.toString(), {
method: 'GET',
headers: {
'x-api-key': apiKey
}
})
.then(response => {
if (response.ok) {
return response.json();
} else {
return { error: `ステータス: ${response.status} で失敗しました` };
}
})
.catch(error => {
return { error: error.message };
});
});
// バッチ内のすべてのリクエストが完了するのを待つ
const batchResults = await Promise.all(batchPromises);
results.push(...batchResults);
// レート制限を避けるためにバッチ間に遅延を追加
if (i + batchSize < queries.length) {
await new Promise(resolve => setTimeout(resolve, delayBetweenBatches));
}
}
return results;
}
// 使用例
const queries = [
"REST APIとの統合",
"認証プロトコル",
"本番環境へのデプロイ方法",
"パフォーマンス最適化技術",
"エラーハンドリングのベストプラクティス"
];
const options = {
numResults: 3,
batchSize: 5,
delayBetweenBatches: 1000,
prevChunks: 1,
nextChunks: 1
};
batchSearchVectorStore("vs_abc123", queries, options)
.then(results => console.log(results))
.catch(error => console.error("バッチ検索に失敗しました:", error));require 'net/http'
require 'uri'
require 'json'
require 'concurrent'
# ベクトルストアに対してバッチ検索を実行する
#
# @param vector_store_id [String] ベクトルストアのID
# @param queries [Array<String>] 検索クエリのリスト
# @param num_results [Integer] クエリごとの結果数
# @param batch_size [Integer] 並列リクエストの数
# @param delay_between_batches [Float] バッチ間の待機時間(秒)
# @return [Array] 各クエリの検索結果
def batch_search_vector_store(vector_store_id, queries, num_results: 5, batch_size: 10, delay_between_batches: 1.0)
results = []
api_key = 'YOUR_API_KEY'
# バッチで処理
queries.each_slice(batch_size).with_index do |batch_queries, batch_index|
# 同時実行のためのスレッドプールを作成
pool = Concurrent::FixedThreadPool.new(batch_size)
futures = []
batch_queries.each do |query|
# 各リクエストをスレッドプールに送信
futures << Concurrent::Future.execute(executor: pool) do
uri = URI("https://api.rememberizer.ai/api/v1/vector-stores/#{vector_store_id}/documents/search")
params = {
q: query,
n: num_results,
prev_chunks: 1,
next_chunks: 1
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['x-api-key'] = api_key
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
begin
response = http.request(request)
if response.code.to_i == 200
JSON.parse(response.body)
else
{ "error" => "ステータスコードで失敗しました: #{response.code}" }
end
rescue => e
{ "error" => e.message }
end
end
end
# すべてのfutureから結果を収集
batch_results = futures.map(&:value)
results.concat(batch_results)
# バッチ間の遅延を追加
if batch_index < (queries.length / batch_size.to_f).ceil - 1
sleep(delay_between_batches)
end
end
pool.shutdown
results
end
# 使用例
queries = [
"REST APIとの統合",
"認証プロトコル",
"本番環境へのデプロイ方法",
"パフォーマンス最適化技術",
"エラーハンドリングのベストプラクティス"
]
results = batch_search_vector_store(
"vs_abc123",
queries,
num_results: 3,
batch_size: 5
)
puts resultsバッチ操作のパフォーマンス最適化
ベクトルストア検索のためのバッチ操作を実装する際は、以下のベストプラクティスを考慮してください。
最適なバッチサイズ: ほとんどのアプリケーションでは、5-10のクエリを並行して処理することで、スループットとリソース使用の良いバランスが得られます。
レート制限の認識: バッチ間に遅延メカニズム(通常1-2秒)を含めて、APIのレート制限に達しないようにします。
エラーハンドリング: バッチ内で失敗する可能性のある個々のクエリに対して、堅牢なエラーハンドリングを実装します。
接続管理: 高ボリュームのアプリケーションでは、オーバーヘッドを減らすために接続プーリングを実装します。
タイムアウト設定: 長時間実行されるクエリが全体のバッチをブロックしないように、各リクエストに適切なタイムアウトを設定します。
結果処理: すべての結果を待つのではなく、利用可能になった結果を非同期に処理することを検討してください。
モニタリング: 平均応答時間や成功率などのパフォーマンス指標を追跡して、最適化の機会を特定します。
非常に高いクエリボリュームを持つプロダクションアプリケーションでは、大規模なバッチを効率的に管理するために、ワーカープロセスを持つキューシステムの実装を検討してください。
このエンドポイントを使用すると、意味的類似性を利用してベクトルストアを検索できます。これは、クエリに正確なキーワードが含まれていなくても、概念的に関連する文書を返します。これにより、自然言語クエリや質問応答に特に強力になります。
Last updated