本文為您介紹DashScope java SDK最佳實踐。
查詢SDK最新版本
https://oss.sonatype.org/#nexus-search;quick~dashscope
最佳實踐
SDK API對象,例如Generation不是線程安全的,您不應該并發使用同一個對象。
因為每一個API對象都對應著一條網絡鏈接,因此為了效率,您應盡可能復用已創建出來的API對象,例如Generation,避免不斷創建造成的開銷,通常可以通過資源池來管理,下面是一個簡單的示例,供參考。
對象池示例(org.apache.commons:commons-pool2)
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import com.alibaba.dashscope.aigc.generation.Generation;
public class PooledDashScopeObjectFactory extends BasePooledObjectFactory<Generation> {
@Override
public Generation create() throws Exception {
return new Generation();
}
@Override
public PooledObject<Generation> wrap(Generation obj) {
return new DefaultPooledObject<>(obj);
}
}
對象池使用
import java.util.Arrays;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
public class PooledDashScopeObjectUsage {
public static void main(String[] args) throws Exception {
PooledDashScopeObjectFactory pooledDashScopeObjectFactory =
new PooledDashScopeObjectFactory();
GenericObjectPoolConfig<Generation> config = new GenericObjectPoolConfig<>();
// 對于語音服務,websocket協議,保持下面值相同
config.setMaxTotal(32);
config.setMaxIdle(32);
config.setMinIdle(32);
GenericObjectPool<Generation> generationPool =
new GenericObjectPool<>(pooledDashScopeObjectFactory, config);
Generation gen = null;
try {
Message systemMsg = Message.builder().role(Role.SYSTEM.getValue())
.content("You are a helpful assistant.").build();
Message userMsg = Message.builder().role(Role.USER.getValue()).content("你好").build();
GenerationParam param = GenerationParam.builder().model("qwen-plus")
.messages(Arrays.asList(systemMsg, userMsg))
.resultFormat(GenerationParam.ResultFormat.MESSAGE).topP(0.8).enableSearch(true)
.build();
gen = generationPool.borrowObject();
GenerationResult result = gen.call(param);
System.out.println(result);
} finally {
if (gen != null) {
generationPool.returnObject(gen);
}
}
System.out.println("completed");
generationPool.close();
}
}
連接配置
底層使用OkHttp庫管理連接,您可以通過代碼和環境變量來配置連接相關參數,通常情況下您不需要修改任何參數,請根據需求謹慎修改。
以下內容適用于java sdk 2.12.0及之后版本!
通過代碼配置連接參數
Constants.connectionConfigurations = ConnectionConfigurations.builder()
.connectTimeout(Duration.ofSeconds(120)) // set connection timeout, default 120s
.readTimeout(Duration.ofSeconds(300)) // set read timeout, default 300s
.writeTimeout(Duration.ofSeconds(60)) // set read timeout, default 60s
.connectionIdleTimeout(Duration.ofSeconds(300)) // connection pool idle timeout, default 300s
.connectionPoolSize(32) // idle connections in the okhttp connection pool.
.maximumAsyncRequests(32) // async requests limit.
.maximumAsyncRequestsPerHost(32) // async request host limit.
.proxyHost("The http proxy host") // set proxy host, if set will use proxy. default null.
.proxyPort(443) // set proxy port, default 443
.proxyAuthenticator(null) // you can customize you proxy authenticator. default null.
.build();
// 更多 connectionPoolSize and connectionIdleTimeout, 可以參考
// ref: https://square.github.io/okhttp/3.x/okhttp/okhttp3/ConnectionPool.html
// maximumAsyncRequests and maximumAsyncRequestsPerHost 只對streamCall, audio相關服務,以及您自行設置
// 的使用websocket連接對象,詳細參考:https://square.github.io/okhttp/3.x/okhttp/okhttp3/Dispatcher.html
通過環境變量配置
詳細信息參考代碼說明。
環境變量 | 說明 |
DASHSCOPE_PROXY_HOST | 配置代理host |
DASHSCOPE_PROXY_PORT | 配置代理port |
DASHSCOPE_CONNECTION_POOL_SIZE | 配置connection pool中idle 連接數。 說明 根據您的負載情況配置,一般配置成流量低峰時并發數,最高并發數目前沒有限制。 超過idle數的空閑連接將在DASHSCOPE_CONNECTION_IDLE_TIME后釋放。 建議您配置一個較小的值,同時將DASHSCOPE_CONNECTION_IDLE_TIME配置一個相對小的值,比如5s。 |
DASHSCOPE_CONNECTION_IDLE_TIME | 配置idle time,與服務端的鏈接將在idle time后斷開。 |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS | 配置最大異步請求數。 異步請求用于流式流式輸出以及websocket請求,語音服務,流式請求,需要根據您的負載配置配置合適的值,參考 |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST | 配置單host最大異步請求數,host范圍內異步請求數。 |
DASHSCOPE_WRITE_TIMEOUT | 配置write timeout |
DASHSCOPE_READ_TIMEOUT | 配置 read timeout |
DASHSCOPE_CONNECTION_TIMEOUT | 配置connection timeout |
更早版本配置
對于2.12.0之前版本,連接connectionPoolSize,maximumAsyncRequests,maximumAsyncRequestsPerHost統一通過環境變量DASHSCOPE_CONNECTION_POOL_SIZE配置。