Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,3 +173,63 @@ public class Main {
```

The `call` method accepts a `GenerationParam`, and returns a `GenerationResult`, you can also catch the exception with a try-catch block.

### Decision Model

The decision model answers a batch of multiple-choice (choice), yes/no (noul) and ordered-scale (score) questions against a given business state, see the [Decision Model API document](https://platform.qianwenai.com/docs/api-reference/decision-model-api).

```java
import com.alibaba.dashscope.decision.DecisionModel;
import com.alibaba.dashscope.decision.DecisionModelParam;
import com.alibaba.dashscope.decision.DecisionModelResult;
import com.alibaba.dashscope.decision.DecisionQuestion;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Main {

public static void main(String[] args) {
// The business state.
Map<String, Object> state = new HashMap<>();
state.put("ticket_id", "T-1001");
state.put("content", "订单支付后超过 24 小时仍未到账,用户无法继续使用核心服务,要求立即处理。");

// The questions.
Map<String, String> options = new LinkedHashMap<>();
options.put("billing", "支付、退款和账单问题");
options.put("technical", "产品故障和集成问题");
List<String> levels = Arrays.asList(
"轻微问题,不影响功能",
"部分功能受影响,但存在替代方案",
"核心功能不可用,没有替代方案",
"造成严重业务或安全影响");
Map<String, DecisionQuestion> questions = new LinkedHashMap<>();
questions.put("department", DecisionQuestion.choice("应该由哪个团队处理?", options));
questions.put("escalate", DecisionQuestion.noul("是否需要立即通知值班人员?"));
questions.put("severity", DecisionQuestion.score("这个问题有多严重?", levels));

DecisionModelParam param = DecisionModelParam.builder()
.model(DecisionModelParam.Models.DECISION_MODEL_PREVIEW)
.state(state)
.questions(questions)
.build();

try {
DecisionModel decisionModel = new DecisionModel();
DecisionModelResult result = decisionModel.call(param);
System.out.println(JsonUtils.toJson(result));
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
System.err.println("An error occurred: " + e.getMessage());
}
}
}
```

The `call` method accepts a `DecisionModelParam`, and returns a `DecisionModelResult` whose `answers` are keyed by question id. Streaming is not supported. The API key is read from the `DASHSCOPE_API_KEY` environment variable by default, or set explicitly with `apiKey(...)`; the request url defaults to `https://maas.qianwenaiapi.com/compatible-mode/v1/systemone`, override it with `new DecisionModel(baseUrl)` or the `DASHSCOPE_HTTP_BASE_URL` environment variable.
62 changes: 61 additions & 1 deletion README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,64 @@ public class Main {
}
```

`call` 方法接受 `GenerationParam`,并返回 `GenerationResult`,您也可以通过 try-catch 块捕获异常。
`call` 方法接受 `GenerationParam`,并返回 `GenerationResult`,您也可以通过 try-catch 块捕获异常。

### 决策模型

决策模型(Decision Model)针对给定的业务状态,批量回答多选一(choice)、是否判断(noul)、有序量表(score)三类问题,详见[决策模型 API 文档](https://platform.qianwenai.com/docs/api-reference/decision-model-api)。

```java
import com.alibaba.dashscope.decision.DecisionModel;
import com.alibaba.dashscope.decision.DecisionModelParam;
import com.alibaba.dashscope.decision.DecisionModelResult;
import com.alibaba.dashscope.decision.DecisionQuestion;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Main {

public static void main(String[] args) {
// 业务状态
Map<String, Object> state = new HashMap<>();
state.put("ticket_id", "T-1001");
state.put("content", "订单支付后超过 24 小时仍未到账,用户无法继续使用核心服务,要求立即处理。");

// 问题列表
Map<String, String> options = new LinkedHashMap<>();
options.put("billing", "支付、退款和账单问题");
options.put("technical", "产品故障和集成问题");
List<String> levels = Arrays.asList(
"轻微问题,不影响功能",
"部分功能受影响,但存在替代方案",
"核心功能不可用,没有替代方案",
"造成严重业务或安全影响");
Map<String, DecisionQuestion> questions = new LinkedHashMap<>();
questions.put("department", DecisionQuestion.choice("应该由哪个团队处理?", options));
questions.put("escalate", DecisionQuestion.noul("是否需要立即通知值班人员?"));
questions.put("severity", DecisionQuestion.score("这个问题有多严重?", levels));

DecisionModelParam param = DecisionModelParam.builder()
.model(DecisionModelParam.Models.DECISION_MODEL_PREVIEW)
.state(state)
.questions(questions)
.build();

try {
DecisionModel decisionModel = new DecisionModel();
DecisionModelResult result = decisionModel.call(param);
System.out.println(JsonUtils.toJson(result));
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
System.err.println("An error occurred: " + e.getMessage());
}
}
}
```

`call` 方法接受 `DecisionModelParam`,并返回 `DecisionModelResult`,其中 `answers` 按问题 id 给出答案,不支持流式输出。API Key 默认从环境变量 `DASHSCOPE_API_KEY` 获取,也可以通过 `apiKey(...)` 指定;请求地址默认为 `https://maas.qianwenaiapi.com/compatible-mode/v1/systemone`,可通过 `new DecisionModel(baseUrl)` 或环境变量 `DASHSCOPE_HTTP_BASE_URL` 覆盖。
47 changes: 47 additions & 0 deletions samples/DecisionModelUsage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright (c) Alibaba, Inc. and its affiliates.

import com.alibaba.dashscope.decision.DecisionModel;
import com.alibaba.dashscope.decision.DecisionModelParam;
import com.alibaba.dashscope.decision.DecisionModelResult;
import com.alibaba.dashscope.decision.DecisionQuestion;
import com.alibaba.dashscope.utils.JsonUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class DecisionModelUsage {
public static void main(String[] args) throws Exception {
Map<String, Object> state = new HashMap<>();
state.put("ticket_id", "T-1001");
state.put("content", "订单支付后超过 24 小时仍未到账,用户无法继续使用核心服务,要求立即处理。");

Map<String, String> options = new LinkedHashMap<>();
options.put("billing", "支付、退款和账单问题");
options.put("technical", "产品故障和集成问题");

List<String> levels =
Arrays.asList(
"轻微问题,不影响功能",
"部分功能受影响,但存在替代方案",
"核心功能不可用,没有替代方案",
"造成严重业务或安全影响");

Map<String, DecisionQuestion> questions = new LinkedHashMap<>();
questions.put("department", DecisionQuestion.choice("应该由哪个团队处理?", options));
questions.put("escalate", DecisionQuestion.noul("是否需要立即通知值班人员?"));
questions.put("severity", DecisionQuestion.score("这个问题有多严重?", levels));

DecisionModelParam param =
DecisionModelParam.builder()
.model(DecisionModelParam.Models.DECISION_MODEL_PREVIEW)
.state(state)
.questions(questions)
.build();

DecisionModel decisionModel = new DecisionModel();
DecisionModelResult result = decisionModel.call(param);
System.out.println(JsonUtils.toJson(result));
}
}
50 changes: 50 additions & 0 deletions src/main/java/com/alibaba/dashscope/decision/DecisionAnswer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (c) Alibaba, Inc. and its affiliates.
package com.alibaba.dashscope.decision;

import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* The answer of a single decision question. Which fields are populated depends on {@link #type}:
*
* <ul>
* <li>{@code choice}: {@link #choice}, {@link #confidence}, {@link #probabilities} (keyed by
* option name).
* <li>{@code noul}: {@link #noul} only — {@link #confidence} and {@link #probabilities} are
* {@code null} per the documented example.
* <li>{@code score}: {@link #score}, {@link #confidence}, {@link #legend}, {@link #probabilities}
* (keyed by stringified level index {@code "0"}, {@code "1"}, ...).
* </ul>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DecisionAnswer {
/** The question type, one of choice/noul/score. */
private String type;

/** The selected option name, only for choice questions. */
private String choice;

/** P(yes) in [0, 1], only for noul questions. */
private Double noul;

/**
* Probability-weighted expectation of the level index, only for score questions. May fall between
* two integer levels (e.g. {@code 1.43}).
*/
private Double score;

/** The confidence of the answer, for choice and score questions. */
private Double confidence;

/** The probability of each option or level; sums to 1. */
private Map<String, Double> probabilities;

/** Level index to level description, only for score questions. */
private Map<String, String> legend;
}
Loading
Loading