注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Palantir 提供モデルを使用してセマンティック検索ワークフローを作成する

Palantir 提供の言語モデルを使用するには、まずエンロールメントで AIP を有効にする必要があります。また、AIP 開発者機能を使用する権限も必要です。カスタムモデルを使用していますか?その場合は、カスタムモデルを使用してセマンティック検索ワークフローを作成するを参照してください。

このページでは、Palantir 提供の埋め込みモデルを使用して、エンドツーエンドのセマンティック検索ワークフローの例を構築する手順を説明します。

手順

まず、埋め込みを生成し、vector 型のプロパティを持つオブジェクトタイプに保存する必要があります。その後、Workshop でセマンティック検索ワークフローを設定する、AIP Chatbot Workshop ウィジェットを使ったソリューションを構築する、または Workshop と AIP Logic で使用するカスタムセマンティック検索関数を作成することができます。

前提条件:

選択肢:

埋め込みを生成し、オブジェクトタイプを作成する

Pipeline Builder の Text to Embeddings 式を使用して、データセット内のテキストをベクトルとして埋め込みます。この式は文字列を受け取り、Palantir 提供モデルのいずれかを使用してベクトルに変換します。この例では、text-embedding-ada-002 埋め込みモデルを使用します。

テキストから埋め込みへの変換

これらの埋め込みは、ベクトルプロパティとしてオントロジーに追加できます。

Pipeline Builder の出力オブジェクトプロパティでベクトルプロパティを設定する

Palantir 提供モデルを使用した埋め込みの生成をより細かく制御したい場合は、Python トランスフォーム内の言語モデルを参照してください。

KNN オブジェクトセットを使用して Workshop 内でシンプルなセマンティック検索ワークフローを作成する(ノーコード)

KNN オブジェクトセットは関連度で並べ替えることができません。順序付けされた結果が必要な場合は、TypeScript v1 または TypeScript v2 を使用する関数による方法を使います。どちらのバージョンも関連度による並べ替えをサポートしています。

Workshop 内で KNN オブジェクトセット(TSv1)を設定すると、ノーコードで簡単にセマンティック検索ワークフローを構築できます。

  1. オブジェクトセットの変数を作成し、埋め込みプロパティを含むオブジェクトタイプを選択します。
  2. フィルターの「+ プロパティに基づく」を選択し、メニューのプロパティ一覧から埋め込みプロパティを選択します。
  3. 選択すると、K 近傍法の設定が表示されます。この設定が表示されない場合は、選択したプロパティが埋め込みプロパティであることを確認してください。

Workshop の KNN 設定

このパネルでは、次の項目を設定できます。

  • K 値: セマンティック検索で返すオブジェクトの数を指定する、1~100の数値です。
  • クエリ: セマンティック検索を実行するときにクエリとして使用する文字列変数です。
  1. 次に、テキスト入力ウィジェットを作成し、その出力変数を上記の KNN クエリオプションに追加します。
  2. 最後に、オブジェクトテーブルウィジェットを追加し、その入力変数を新しく作成した KNN オブジェクトセットに設定します。

Workshop の KNN セマンティック検索

セマンティック検索ロジックをより細かくカスタマイズするには、関数に関するセクションを参照してください。

AIP Chatbot を使用する(ノーコード)

AIP Chatbot で作成した AIP Chatbot(旧称 AIP Agent)は、コードが不要なため、オブジェクトを横断するセマンティック検索をはじめるのに適しています。機能をより細かく制御してセマンティック検索を組み込む方法について、詳しくはこちら。

はじめにガイドの手順に沿って AIP Chatbot を作成し、オントロジーコンテキストまたはオントロジーセマンティック検索ツールを追加します。この初期セットアップにより、AIP Chatbot にオブジェクトのセマンティック検索を依頼できるようになります。

Workshop や AIP Logic で使用するためにオブジェクト全体をセマンティック検索する関数を作成する

関数リポジトリと、オブジェクトタイプをクエリする関数を作成します。目的は、ユーザー入力を受け取り、オブジェクトタイプに対して KNN 検索を実行することです。TypeScript v1 では、まず前の手順で使用したものと同じ Palantir 提供モデルでベクトルを生成します。Palantir 提供モデルを TypeScript v1 関数にインポートする方法については、TypeScript v1 関数の言語モデルを参照してください。TypeScript v2 と Python は、以下で説明するようにクエリをテキストとして受け取ります。

関数のベクトルプロパティを有効にする

先に進む前に、Functions のコードリポジトリの functions.json ファイルに "enableVectorProperties": true エントリがあることを確認してください。このエントリがない場合は、functions.json に追加し、変更をコミットしてから先に進んでください。さらにサポートが必要な場合は、Palantir の担当者にお問い合わせください。

functions.json 設定ファイルは、TypeScript v1 リポジトリのアーティファクトです。TypeScript v2 または Python リポジトリについては、同等のベクトルプロパティ設定はドキュメントに記載されていないため、このエントリがそれらにも適用されると想定しないでください。TypeScript v2 または Python リポジトリで KNN 検索に失敗する場合は、Palantir の担当者にお問い合わせください。

セマンティック検索関数の例

このセクションのコード例は、TypeScript v1、TypeScript v2、および Python 関数で利用可能です。関数のバージョンに合ったタブを選択します。TypeScript v1 では、各関数をエクスポートされたクラスのメソッドとして定義し、そのメソッドに @foundry/functions-api の @Function() デコレーターを適用して、Objects.search() を通じてオントロジーをクエリします。TypeScript v2 では、export default で関数を定義し、@osdk/functions からデータ型をインポートして、パラメーターとして渡されたオントロジー SDK クライアントを通じてオントロジーをクエリします。Python では、@function デコレーターを使用し、関数の本文でオントロジー SDK クライアントを構築します。詳しい比較については、TypeScript v1 と TypeScript v2 の比較を参照してください。

3つのバージョンでは、クエリの埋め込みを生成する場所と、関数を定義する必要がある場所が異なります。

  • TypeScript v1 は、Palantir 提供の埋め込みモデルでクエリ自体を埋め込みに変換し、生成されたベクトルを nearestNeighbors に渡します。関数はエクスポートされたクラスのメソッドであり、通常は functions-typescript/src/index.ts に定義します。
  • TypeScript v2 は、ユーザーのテキストを nearestNeighbors に直接渡します。nearestNeighbors はクエリベクトルまたはクエリテキストのいずれも受け取ります。埋め込みを別途呼び出す必要がないため、2段階のワークフローが1段階になります。関数は typescript-functions/src/functions ディレクトリ内のファイルのデフォルトエクスポートである必要があり、ファイル名は関数名と一致する必要があります。要件の詳細については、関数を記述するを参照してください。
  • Python も、nearest_neighbors を通じてクエリをテキストとして受け取ります。このメソッドはベータ機能であるため、関数は @function(beta=True) で宣言します。

TypeScript v1 の例で TextEmbeddingAda_002.createEmbeddings を使用して行っているように、埋め込みを別のステップで生成する処理については、TypeScript v2 で同等の処理はドキュメントに記載されていません。このワークフローでは、KNN 検索中にクエリテキストが埋め込みに変換されるため、そのような処理は必要ありません。ほかの目的で TypeScript v2 または Python 関数から Palantir 提供モデルを直接呼び出すには、TypeScript v2 および Python 関数の言語モデルを参照してください。

近傍の件数の上限は、TypeScript のバージョン間で異なります。TypeScript v1 では k 値が 0 < K <= 100 の範囲に制限されますが、TypeScript v2 の numNeighbors 引数は 1 から 500 までの値を受け取ります。

TypeScript v1 は、別途 .orderByRelevance() を呼び出して一致結果を並べ替えてから、上位 k 件の結果を取得します。TypeScript v2 は、fetchPage() に $orderBy: "relevance" を渡すことで関連度順の並べ替えをリクエストします。Python については同等の処理はドキュメントに記載されていません。代わりに、検索に渡す近傍の件数によって結果の件数が制限されます。Python の nearest_neighbors メソッドが返すオブジェクトには、_score フィールドも含まれます。

以下の TypeScript v2 と Python の例は、TypeScript v1 の例と同じクエリテキストと近傍の件数を受け取り、最も近いオブジェクトを返します。TypeScript v2 関数は、さらに最初のパラメーターとしてオントロジー SDK クライアントを受け取ります。

以下の各コードスニペットでは、すべての ObjectApiName をご自身のオブジェクトタイプに置き換えます。この識別子は、先頭の文字が小文字の objectApiName として現れる場合もあります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import { Function, Integer } from "@foundry/functions-api"; import { Objects, ObjectApiName } from "@foundry/ontology-api"; import { TextEmbeddingAda_002 } from "@foundry/models-api/language-models" export class MyFunctions { @Function() public async findRelevantObjects( query: string, kValue: Integer, ): Promise<ObjectApiName[]> { if (query.length < 1) { return [] } const embedding = await TextEmbeddingAda_002.createEmbeddings({inputs: [query]}).then(r => r.embeddings[0]); return Objects.search() .objectApiName() .nearestNeighbors(obj => obj.embeddings.near(embedding, {kValue: kValue})) .orderByRelevance() .take(kValue); } }
Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import { Client, Osdk } from "@osdk/client"; import { Integer } from "@osdk/functions"; import { ObjectApiName } from "@ontology/sdk"; export default async function findRelevantObjects( client: Client, query: string, kValue: Integer, ): Promise<Osdk.Instance<ObjectApiName>[]> { if (query.length < 1) { return []; } // nearestNeighbors がクエリテキストの埋め込みを生成するため、埋め込み生成の呼び出しを別途行う必要はありません。 const page = await client(ObjectApiName) .nearestNeighbors(query, kValue, "embeddings") .fetchPage({ $pageSize: kValue, $orderBy: "relevance" }); return page.data; }
Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from functions.api import function, Integer from ontology_sdk import FoundryClient from ontology_sdk.ontology.objects import ObjectApiName @function(beta=True) def find_relevant_objects(query: str, k_value: Integer) -> list[ObjectApiName]: if len(query) < 1: return [] client = FoundryClient() # nearest_neighbors がクエリテキストの埋め込みを生成するため、埋め込み生成の呼び出しを別途行う必要はありません。 return list( client.ontology.objects.ObjectApiName.nearest_neighbors( query=query, num_neighbors=k_value, vector_property=ObjectApiName.object_type.embeddings, ) )

これで、自然言語でオブジェクトをクエリするセマンティック検索を実行できる関数ができました。Foundry 内のどこでもこの関数を使用できるように、忘れずに関数を公開してください。

Workshop でセマンティック検索関数を使用する

  1. まず、Workshop アプリケーションを作成します。
  2. テキスト入力ウィジェットを追加します。これは、公開済みの KNN ドキュメント取得関数への入力として使用されます。
  3. 以下に示すように、入力として関数から生成されたオブジェクトセットと、選択した入力を指定したオブジェクトリストウィジェットを追加します。
オブジェクトセットを生成する KNN 関数
  1. 上述の制限の範囲内で、近傍の件数(TypeScript では kValue、Python では k_value)を、返してほしい結果の件数に設定します。TypeScript v1 には、さらに所定の制限も適用されます。

AIP Logic でセマンティック検索関数を使用する

公開済みの関数を AIP Logic 内のツールとして追加します。次のようなプロンプトで、言語モデルにツールを使用するよう指示します。

findRelevantObjects ツールを使用して、kValue を5に設定し、最も関連性の高いオブジェクトを見つけてください。ツールを使用する際は、query を引用符で囲むことを忘れないでください。