OpenAI- OpenAI Decisions API guide
OpenAI Decisions API (POST /v1/decisions) テキスト、画像、または
確率を伴う会話入力。それは、DecisionModel2 つのモジュールの API:
langchain4j-open-aiのOpenAiDecisionModel。LangChain4j の HTTP クライアントを使用します。- 公式 OpenAI Java SDK を使用する
langchain4j-open-ai-officialのOpenAiOfficialDecisionModel
この統合は実験的なものであり、将来のリリースでは変更される可能性があります。
Maven の依存関係
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.23.0</version>
</dependency>
または、公式 SDK の場合:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-official</artifactId>
<version>1.23.0-beta33</version>
</dependency>
使用法
DecisionModel decisionModel = OpenAiDecisionModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(OpenAiDecisionModelName.GPT_6_LUNA)
.build();
DecisionRequest request = DecisionRequest.builder()
.input("Help! My payouts have been failing for 3 days and nobody answers my emails.")
.question("team", ChoiceQuestion.builder()
.text("Which team should handle this ticket?")
.option("billing", "Payments, payouts, invoices, refunds")
.option("support", "Problems using the product")
.option("sales", "Pricing, upgrades, new accounts")
.build())
.question("urgent", YesNoQuestion.from("Does this need attention today?"))
.build();
DecisionResponse response = decisionModel.decide(request);
response.choice("team").value(); // "billing"
response.yesNo("urgent").probability(); // 0.93
公式 SDK では、モデル名を String とする OpenAiOfficialDecisionModel を使用します。
DecisionModel decisionModel = OpenAiOfficialDecisionModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-6-luna")
.build();
モジュールの他のモデルと同じクライアント設定があります (baseUrl、timeout、maxRetries など)。
そしてopenAIClient。
プロンプトキャッシュOpenAI は、リクエストの共有入力を自動的にキャッシュします。同じ入力で始まるその後のリクエスト (少なくとも
1,024 トークン)低価格でキャッシュから読み取ります。キャッシュへの 書き込みにも料金がかかります。質問は一部ではありません
キャッシュされた入力を保存できるため、同じ長い文書、画像、会話についてさまざまな質問をすることができます。
キャッシュを再利用します。 「プロンプト キャッシュによる共有入力の再利用」を参照してください。
OpenAI Decisions API guide。
キャッシュの再利用をリクエストのグループ間で個別に (たとえば顧客ごとに) 維持するには、プロンプト キャッシュ キーを設定します (
prompt_cache_key)。同じキーを持つリクエストのみが、お互いのキャッシュされた入力を再利用します。
DecisionModel decisionModel = OpenAiDecisionModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(OpenAiDecisionModelName.GPT_6_LUNA)
.promptCacheKey("customer-123")
.build();
1 つのリクエストに別のキーを使用するには、OpenAiDecisionRequestParameters で設定します。
(OpenAiOfficialDecisionRequestParameters は OpenAiOfficialDecisionModel で、promptCacheKey(...) をサポートします。
同じように)。これは、ビルダーに設定されたキーを置き換えます。
DecisionRequest request = DecisionRequest.builder()
.input("Help! My payouts have been failing for 3 days.")
.question("urgent", YesNoQuestion.from("Does this need attention today?"))
.parameters(OpenAiDecisionRequestParameters.builder()
.promptCacheKey("customer-456")
.build())
.build();
response.tokenUsage() は、キャッシュから読み取られ、キャッシュに書き込まれた入力トークンの数を示します (「
Token usage)。
カスタムパラメータOpenAiDecisionModel がまだサポートしていないパラメータを送信するには、customParameters(...) で設定します。に追加されます
すべてのリクエストの JSON 本文:
DecisionModel decisionModel = OpenAiDecisionModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(OpenAiDecisionModelName.GPT_6_LUNA)
.customParameters(Map.of("parameter_name", "value"))
.build();
単一リクエストのカスタム パラメータを設定するには、OpenAiDecisionRequestParameters を使用します。
(OpenAiOfficialDecisionRequestParameters は OpenAiOfficialDecisionModel で、カスタム パラメーターをサポートします。
同じように)。空でない場合は、ビルダーに設定されたカスタム パラメータを置き換えます (マージされません)。
DecisionRequest request = DecisionRequest.builder()
.input(...)
.question(...)
.parameters(OpenAiDecisionRequestParameters.builder()
.customParameters(Map.of("parameter_name", "another value"))
.build())
.build();
値はそのまま JSON に書き込まれるため、Map 値は JSON オブジェクトになり、String は文字列のままになります。
LangChain4j が送信するパラメーターと同じ名前のカスタム パラメーター (model など) で置き換えられます。選択するには
モデルでは modelName(...) を使用します。model カスタム パラメーターは modelName() またはどのリスナーにも反映されません。
受け取ります。回答は常に DecisionRequest の質問に対して読み取られるため、questions や
input。
Use the parameters class of the model you call. For example, passing OpenAiDecisionRequestParameters to
OpenAiOfficialDecisionModel fails with an IllegalArgumentException. DecisionRequestParameters.builder()、
すべての意思決定モデルに共通のパラメーターのみを持ち、すべてのモデルで機能します。
スプリングブーツ使用するモジュールのスターターを追加します。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot4-starter</artifactId>
<version>1.23.0-beta33</version>
</dependency>
公式SDKの場合はlangchain4j-open-ai-official-spring-boot4-starter。 Spring Boot 3 では、次を使用します。
代わりに langchain4j-open-ai-spring-boot-starter または langchain4j-open-ai-official-spring-boot-starter
(Spring Boot Integrationを参照)。
OpenAiDecisionModel Bean は、API キーが application.properties に設定されると作成されます。
# Mandatory properties:
langchain4j.open-ai.decision-model.api-key=${OPENAI_API_KEY}
langchain4j.open-ai.decision-model.model-name=gpt-6-luna
# Optional properties:
langchain4j.open-ai.decision-model.base-url=...
langchain4j.open-ai.decision-model.organization-id=...
langchain4j.open-ai.decision-model.project-id=...
langchain4j.open-ai.decision-model.timeout=...
langchain4j.open-ai.decision-model.max-retries=...
langchain4j.open-ai.decision-model.log-requests=...
langchain4j.open-ai.decision-model.log-responses=...
langchain4j.open-ai.decision-model.custom-headers...=...
langchain4j.open-ai.decision-model.custom-query-params...=...
公式 SDK スターターを使用すると、代わりに OpenAiOfficialDecisionModel Bean が作成されます。
# Mandatory properties:
langchain4j.open-ai-official.decision-model.api-key=${OPENAI_API_KEY}
langchain4j.open-ai-official.decision-model.model-name=gpt-6-luna
# Optional properties:
langchain4j.open-ai-official.decision-model.base-url=...
langchain4j.open-ai-official.decision-model.organization-id=...
langchain4j.open-ai-official.decision-model.timeout=...
langchain4j.open-ai-official.decision-model.max-retries=...
langchain4j.open-ai-official.decision-model.custom-headers...=...
DecisionModelListener Bean はデシジョン モデルに自動的に登録されます。
langchain4j-open-ai を使用すると、スターターは Spring の RestClient によるブロッキング呼び出しと、次のような非ブロッキング呼び出しを送信します。
decideAsync(...) として Spring の WebClient を指定します。これにはクラスパス上に spring-webflux が必要です: を参照してください。
Spring Boot Integration。 Without it, decideAsync(...) fails with
AsyncNotSupportedException。
入力入力は次のとおりです。
- テキスト (
input(...)); - 名前付きフィールド (
inputFields(...)): 各フィールドは、名前がラベル付けされたテキスト部分として送信され、値は JSON として送信されます。 (comment: "...")、およびその名前を含むテキスト部分の直後の各画像 (photo:)。 - 会話 (
inputMessages(...)、下記を参照); TextContentおよびImageContent(inputContents(...)) のリスト。たとえば、 説明:
DecisionRequest request = DecisionRequest.builder()
.inputContents(List.of(
TextContent.from("The customer says the package arrived like this."),
ImageContent.from(base64Image, "image/jpeg")))
.question("damaged", YesNoQuestion.from("Is the item visibly damaged?"))
.build();
画像は、base64 データ、data: URL、または OpenAI がダウンロードする公開アクセス可能な http または https URL にすることができます。
それ自体 (ImageContent.from("https://example.com/package.jpg") など)。詳細レベル LOW、HIGH、AUTO
サポートされています。 MEDIUM および ULTRA_HIGH は UnsupportedFeatureException で拒否されます。
入力は会話、inputMessages(...) で設定された ChatMessage のリストにすることもできます。として送信されます
ユーザー メッセージ内の transcript in JSON の後に、
マーカー ([image 1]:) が付いたテキスト部分の後の会話。 OpenAI system、user、および
assistant メッセージ。これにより、システム メッセージは会話として追跡されるのではなく、会話の一部として判断されます。
指示。
テキストもツール実行リクエストも含まれていない AiMessage はスキップされ、送信するものが何も残っていない会話が行われます。
API を呼び出す前に IllegalArgumentException で拒否されます。テキストや画像以外のコンテンツ、
CustomMessage、UnsupportedFeatureException で拒否されます。
質問と回答
DecisionModel | OpenAI | メモ |
|---|---|---|
YesNoQuestion | predicate | yesWhen と noWhen が質問に追加されます。 |
ChoiceQuestion | choice | オプション名は、その説明とともに値として送信されます。 |
ScaleQuestion | score | レベルはラベルとして送信されます。 |
| 選択肢とスケールの回答には、各オプションまたはレベルの確率と信頼度が含まれます。 | ||
| API は、OpenAI の使用ポリシーに反するなどの理由で、単一の質問への回答を拒否する場合があります。 | ||
他の質問に対する回答は引き続き返され、response.isRefused(name) は拒否された質問に対して true を返します。 | ||
| question (see Refusals). |
トークンの使用法response.tokenUsage() は、入力数を含む OpenAiTokenUsage (または OpenAiOfficialTokenUsage) です。
トークンはプロンプト キャッシュから読み取られ、プロンプト キャッシュに書き込まれます。両方とも入力トークンですでにカウントされています。
OpenAiTokenUsage tokenUsage = (OpenAiTokenUsage) response.tokenUsage();
Integer cachedTokens = tokenUsage.inputTokensDetails().cachedTokens();
Integer cacheWriteTokens = tokenUsage.inputTokensDetails().cacheWriteTokens();