埋め込みモデルのプロバイダーの設定
埋め込みモデルが AI 検索 検索拡張生成 (RAG) アプリケーションで機能するように、使用する AI プロバイダーを決定します。
始める前に
希望するプロバイダーの接続および資格情報エイリアスを構成します。詳細については、「Create a Connection & Credential alias」を参照してください。
必要なロール:admin
手順
- 移動先 すべてをクリックし、フィルターに 「sys_one_extend_capability.list 」と入力して OneExtend 機能テーブルに移動します。
- [独自の埋め込みモデルを使用する] 機能を選択します。
- [OneExtend 機能定義] 関連リストで、[ 新規] を選択します。
-
[ 名前 ] フィールドに、機能定義の名前を入力します。
たとえば、生成の埋め込み (Azure OpenAI) などです
- [API タイプ] フィールドで [システム] を選択します。
-
[API] フィールドで、検索アイコン (
) を選択してドキュメントを選択します。
- [ テーブル名 ] フィールドで、One API システム実行ツール [one_api_system_executor] テーブルを選択します。
- ドキュメント フィールドで、汎用埋め込み を選択します。
- [OK] を選択します。
- [ 接続および資格情報エイリアス ] フィールドで、カスタム埋め込みモデルと統合するエイリアスを選択します。
- [詳細] オプションを選択します。
-
前処理スクリプトと後処理スクリプトを作成します。
AI 検索 RAGアプリケーションが埋め込みモデルとシームレスに連携できるようにするには、前処理スクリプトと後処理スクリプトを作成する必要があります。これらのスクリプトは、モデルが予期して生成するデータの形式を AI 検索 RAG アプリケーションが理解するのに役立ちます。次の例は、 Azure OpenAI 要求構造のプリプロセッサースクリプトを示しています。
次の例は、 Azure OpenAI 要求構造の応答ポストプロセッサースクリプトを示しています。(function(inputs) { //// inputs is the capability inputs which contains request. /* write code here to transform capability input to definition input. *{ "request": { //request contains rawInput which will be system-provided. "rawInput": { //rawInput contains passages(Array of text segments), type(Context of the input) and modelId(Name of the embedding model) "passages": ["Sample text"], "type": "ingest/query", "model": "text-embedding-3-large" }, "providerInput": { //providerInput should be populated using the relevant data from rawInput.passages. "input": ["Sample text"] //The field name "input" inside providerInput is provider-specific and rawInput.passages should be mapped to the appropriate field expected by your provider } } } try { var parsedInputs = JSON.parse(inputs); var request = parsedInputs.request; var rawInput = request.rawInput; var passagesArray = rawInput.passages; var type = rawInput.type; if (passagesArray && passagesArray.length > 0) { parsedInputs.request.providerInput = {}; parsedInputs.request.providerInput.input = passagesArray; } } catch (ex) { gs.error("Exception occured while preprocessing of the inputs." + ex); throw new Error("Exception occured while OE preprocessing of the inputs : " + ex); } inputs = parsedInputs; return inputs; })(inputs);(function(outputs) { /* write code here to transform definition output to capability output. * outputs contains result from the provider definition implementation. * Expected outputs format from provider definition implementation in success scenario: "result": { "provider": "custom_embedding_model", "logId": "0ee6f4f4ff112210b6e1ffffffffff03", "status": "success", "response": {"object":"list","data":[{"object":"embedding","index":0,"embedding":[0.008695375,0.0011188902]},{"object":"embedding","index":1,"embedding":[0.012572239,0.017366657]}],"model":"text-embedding-3-large","usage":{"prompt_tokens":4,"total_tokens":4}} } * Expected outputs format from provider definition implementation in error scenario: "result": { "responseHeaders": "[Content-Length: 224\r\n, Content-Type: application/json\r\n, apim-request-id: 72b1519e-a367-4f01-b249-8f37d35d50d3\r\n, Date: Thu, 01 May 2025 12:03:44 GMT\r\n]", "responseBody": "{\"error\":{\"code\":\"401\",\"message\":\"Access denied due to invalid subscription key or wrong API endpoint. Make sure to provide a valid key for an active subscription and use a correct regional API endpoint for your resource.\"}}", "provider": "custom_embedding_model", "errorCode": "401", "logId": "0ee6f4f4ff112210b6e1ffffffffff03", "error": "PermissionDenied", "status": "error" } * Extract the embeddings from the response key of the provider result (in a successful scenario) and elevate it in the final output. Sample format for the same: "result": { "provider": "custom_embedding_model", "logId": "0ee6f4f4ff112210b6e1ffffffffff03", "status": "success", "response": {"object":"list","data":[{"object":"embedding","index":0,"embedding":[0.008695375,0.0011188902]},{"object":"embedding","index":1,"embedding":[0.012572239,0.017366657]}],"model":"text-embedding-3-large","usage":{"prompt_tokens":4,"total_tokens":4}} "embeddings": [[0.008695375,0.0011188902], [0.012572239,0.017366657]] } */ try { outputs = JSON.parse(outputs); var embeddingsArray = []; if (!gs.nil(outputs.result) && !gs.nil(outputs.result.response)) { var responseBody = outputs.result.response; if (!gs.nil(responseBody)) { var data = JSON.parse(responseBody).data; for (var i = 0; i < data.length; i++) { var embeddingResponse = data[i]; if (!gs.nil(embeddingResponse) && !gs.nil(embeddingResponse.embedding)) embeddingsArray.push(embeddingResponse.embedding); } } outputs.result.embeddings = embeddingsArray; } } catch (ex) { gs.error("Exception occured while OE postprocessing of the outputs = " + ex); outputs.result.status = "error"; outputs.result.error = gs.getMessage("Exception occured while OE postprocessing of the outputs : " + ex); } return outputs; })(outputs); - [Submit (送信)] を選択します。