query_group_by() メソッドを使用して、コレクションを検索し、指定フィールドの値に基づいて結果をグループ化します。これは、検索拡張生成(RAG)パイプラインにおいて特に有用です。たとえば、1 つのドキュメントが複数のチャンクに分割される場合、グループ化を行わないと、上位の検索結果に同一ドキュメントからのチャンクが複数含まれ、他のドキュメントが十分に表現されない可能性があります。
前提条件
開始する前に、以下の準備が完了していることを確認してください。
クラスター。詳細については、「クラスターを作成する」をご参照ください。
API キーです。詳細については、「API キーの管理」をご参照ください。
最新版 DashVector SDK がインストール済みであること。詳細については、「DashVector SDK のインストール」をご参照ください。
API 定義
Collection.query_group_by(
self,
vector: Optional[Union[List[Union[int, float]], np.ndarray]] = None,
*,
group_by_field: str,
group_count: int = 10,
group_topk: int = 10,
id: Optional[str] = None,
filter: Optional[str] = None,
include_vector: bool = False,
partition: Optional[str] = None,
output_fields: Optional[List[str]] = None,
sparse_vector: Optional[Dict[int, float]] = None,
async_req: bool = False,
) -> DashVectorResponse:例
YOUR_API_KEYをご自身の API キーに置き換え、YOUR_CLUSTER_ENDPOINTをご自身のクラスターのエンドポイントに置き換えてから、サンプルコードを実行してください。
以下のすべてのサンプルコードは、同一のデータセットを使用します。まず、コレクションの作成およびサンプルデータの挿入を行うため、次のセットアップコードを実行してください。
import dashvector
import numpy as np
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
ret = client.create(
name='group_by_demo',
dimension=4,
fields_schema={'document_id': str, 'chunk_id': int}
)
assert ret
collection = client.get(name='group_by_demo')
ret = collection.insert([
('1', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 1, 'content': 'xxxA'}),
('2', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 2, 'content': 'xxxB'}),
('3', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 1, 'content': 'xxxC'}),
('4', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 2, 'content': 'xxxD'}),
('5', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 3, 'content': 'xxxE'}),
('6', np.random.rand(4), {'document_id': 'paper-03', 'chunk_id': 1, 'content': 'xxxF'}),
])
assert retベクターによる検索
クエリベクターを指定し、グループ化対象のフィールドを設定します。group_count パラメーターで返されるグループ数を制御し、group_topk パラメーターで各グループに含める結果数を制御します。
ret = collection.query_group_by(
vector=[0.1, 0.2, 0.3, 0.4],
group_by_field='document_id', # document_id フィールドで結果をグループ化します。
group_count=2, # 最大 2 つのグループを返します。
group_topk=2, # 各グループにつき最大 2 件の結果を返します。
)
if ret:
print('query_group_by success')
print(len(ret))
print('------------------------')
for group in ret:
print('group key:', group.group_id)
for doc in group.docs:
prefix = ' -'
print(prefix, doc)期待される出力:
query_group_by success
4
------------------------
group key: paper-01
- {"id": "2", "fields": {"document_id": "paper-01", "chunk_id": 2, "content": "xxxB"}, "score": 0.6807}
- {"id": "1", "fields": {"document_id": "paper-01", "chunk_id": 1, "content": "xxxA"}, "score": 0.4289}
group key: paper-02
- {"id": "3", "fields": {"document_id": "paper-02", "chunk_id": 1, "content": "xxxC"}, "score": 0.6553}
- {"id": "5", "fields": {"document_id": "paper-02", "chunk_id": 3, "content": "xxxE"}, "score": 0.4401}応答には、類似度スコア順にランク付けされた 2 つのグループ(paper-01 および paper-02)が含まれ、各グループには最大 2 件の結果が含まれます。
プライマリキーによる検索
id パラメーターを使用して、特定のドキュメントに格納されたベクターに基づくグループ化検索を実行します。
ret = collection.query_group_by(
id='1',
group_by_field='name',
)
if ret:
print('query_group_by success')
print(len(ret))
for group in ret:
print('group:', group.group_id)
for doc in group.docs:
print(doc)
print(doc.id)
print(doc.vector)
print(doc.fields)フィルターを用いた検索
ベクターまたはプライマリキーに加え、filter 式を組み合わせることで、グループ化前の検索結果を絞り込みます。フィルター式は SQL の WHERE 句構文に従う必要があります。
ret = collection.query(
vector=[0.1, 0.2, 0.3, 0.4], # プライマリキーによる検索の場合は、代わりに id='...' を使用します。
group_by_field='name',
filter='age > 18', # age が 18 より大きいドキュメントのみを返します。
output_fields=['name', 'age'], # name および age フィールドのみを返します。
include_vector=True
)完全なフィルター構文については、「条件付きフィルタリング」をご参照ください。
密ベクターおよび疎ベクターを用いた検索
vector および sparse_vector の両方を指定することで、密検索と疎検索を統合できます。これにより、キーワード認識型の意味検索が可能となり、疎ベクターがキーワードの重みを、密な意味埋め込みとともにエンコードします。
ret = collection.query(
vector=[0.1, 0.2, 0.3, 0.4],
sparse_vector={1: 0.3, 20: 0.7},
group_by_field='name',
)キーワード認識型の意味ベクトル検索の詳細については、「キーワード認識型意味ベクトル検索」をご参照ください。
リクエストパラメーター
vectorまたはidのいずれかを指定してください。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
group_by_field | str | None | 必須。 結果をグループ化する対象のフィールドです。スキーマフリーのフィールドはサポートされていません。 |
vector | Optional[Union[List[Union[int, float]], np.ndarray]] | None | クエリベクターです。 |
id | Optional[str] | None | プライマリキーです。このドキュメントに格納されたベクターを用いて検索します。 |
group_count | int | 10 | 返す最大グループ数です。これはベストエフォートパラメーターであり、通常は指定した数のグループを返すことができます。 |
group_topk | int | 10 | 各グループにつき返す類似結果の数です。これは group_count より優先度の低いベストエフォートパラメーターです。 |
filter | Optional[str] | None | SQL WHERE 句の構文を使用した条件付きフィルター。詳細については、「条件付きフィルター」をご参照ください。 |
include_vector | bool | False | 応答にベクトルデータを含めるかどうかを指定します。 |
partition | Optional[str] | None | 検索対象のパーティションです。 |
output_fields | Optional[List[str]] | None | 返すフィールドです。デフォルトではすべてのフィールドを返します。 |
sparse_vector | Optional[Dict[int, float]] | None | キーワード認識型検索用の疎ベクターです。 |
async_req | bool | False | リクエストを非同期で送信するかどうかを指定します。 |
応答パラメーター
DashVectorResponse オブジェクトを返します。状態コードの詳細については、「状態コード」をご参照ください。
| パラメーター | 型 | 説明 | 例 |
|---|---|---|---|
code | int | 状態コードです。 | 0 |
message | str | 応答メッセージです。 | success |
request_id | str | リクエスト ID です。 | 19215409-ea66-4db9-8764-26ce2eb5bb99 |
output | List[Group] | グループ化検索の結果です。 | — |
制限事項
group_by_fieldは、スキーマで定義されたフィールドである必要があります。スキーマフリーのフィールドはサポートされていません。group_countおよびgroup_topkはベストエフォートパラメーターです。実際に返されるグループ数または各グループ内の結果数は、指定値より少なくなる場合があります。