ChatGLM
支持的領域 / 任務:aigc
模型概覽
模型名 | 模型簡介 |
chatglm-6b-v2 | 該模型為ChatGLM2系列,僅支持prompt格式輸入。 |
chatglm3-6b | 該模型為ChatGLM3系列,支持輸入輸出token合計是7500,其中單輪最大輸出token為1500,單輪最大輸入token為6000(如果超過該閾值按最后一次完整的對話進行截斷),支持message和prompt格式輸入,支持流式調用。 |
SDK使用
前提條件
已開通服務并獲得API-KEY:API-KEY的獲取與配置。
已安裝最新版SDK:安裝DashScope SDK。
文本生成
以下示例展示了調用ChatGLM模型對一個用戶指令進行響應的代碼。
需要使用您的API-KEY替換示例中的YOUR_DASHSCOPE_API_KEY
,代碼才能正常運行。
設置API-KEY
export DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY
通過message訪問
重要目前只有chatglm3-6b支持message方式訪問。
from http import HTTPStatus from dashscope import Generation def call_with_messages(): messages = [ {'role': 'system', 'content':'You are a helpful assistant.'}, {'role': 'user', 'content': '介紹下杭州'}] gen = Generation() response = gen.call( 'chatglm3-6b', messages=messages, result_format='message', # set the result is message format. ) print(response) if __name__ == '__main__': call_with_messages()
// Copyright (c) Alibaba, Inc. and its affiliates. import java.util.ArrayList; import java.util.List; 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; import com.alibaba.dashscope.exception.ApiException; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.JsonUtils; public class Main { public static void usage() throws NoApiKeyException, ApiException, InputRequiredException { List<Message> msgManager = new ArrayList<>(); 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(); msgManager.add(systemMsg); msgManager.add(userMsg); GenerationParam param = GenerationParam.builder() .model("chatglm3-6b") .messages(msgManager) .build(); Generation gen = new Generation(); GenerationResult result = gen.call(param); System.out.println(JsonUtils.toJson(result)); } public static void main(String[] args) { try { usage(); } catch (ApiException | NoApiKeyException | InputRequiredException e) { System.out.println(e.getMessage()); } System.exit(0); } }
通過prompt調用
from http import HTTPStatus import dashscope def call_with_prompt(): prompt = '介紹下杭州' rsp = dashscope.Generation.call(model='chatglm3-6b', prompt=prompt, history=[]) print(rsp) if rsp.status_code == HTTPStatus.OK: print(rsp.output) print(rsp.usage) else: print('Failed, status_code: %s, code: %s, message: %s' % (rsp.status_code, rsp.code, rsp.message)) if __name__ == '__main__': call_with_prompt()
// 參數定義,保存文件為ChatGLMParam.java import static com.alibaba.dashscope.utils.ApiKeywords.HISTORY; import static com.alibaba.dashscope.utils.ApiKeywords.PROMPT; import com.alibaba.dashscope.base.HalfDuplexServiceParam; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.utils.ApiKeywords; import com.alibaba.dashscope.utils.JsonUtils; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import java.nio.ByteBuffer; import java.util.List; import java.util.Map; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.SuperBuilder; @EqualsAndHashCode(callSuper = true) @Data @SuperBuilder public class ChatGLMParam extends HalfDuplexServiceParam { /** The input prompt. */ private String prompt; /** { "user":"今天天氣好嗎?", "bot":"今天天氣不錯,要出去玩玩嘛?" }, */ private List<List<String>> history; @Override public JsonObject getInput() { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty(PROMPT, getPrompt()); JsonArray ar = JsonUtils.toJsonElement(history).getAsJsonArray(); jsonObject.add(HISTORY, ar); return jsonObject; } /** * Get the websocket binary data, only for websocket binary input data. * * @return Generation param has no binary data. */ @Override public ByteBuffer getBinaryData() { return null; } @Override public JsonObject getHttpBody() { JsonObject requestObject = new JsonObject(); requestObject.addProperty(ApiKeywords.MODEL, getModel()); requestObject.add(ApiKeywords.INPUT, getInput()); Map<String, Object> params = getParameters(); if (params != null && !params.isEmpty()) { requestObject.add(ApiKeywords.PARAMETERS, JsonUtils.parametersToJsonObject(params)); } return requestObject; } @Override public void validate() throws InputRequiredException {} } // ChatGlm主類,保存成Main.java,需要用到參數類 import java.util.Arrays; import com.alibaba.dashscope.common.DashScopeResult; import com.alibaba.dashscope.exception.ApiException; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.GeneralHalfDuplexApi; import com.alibaba.dashscope.utils.JsonUtils; public class Main { public static void usage() throws NoApiKeyException, ApiException, InputRequiredException { GeneralHalfDuplexApi gen = new GeneralHalfDuplexApi(); ChatGLMParam param = ChatGLMParam.builder().model("chatglm3-6b").prompt("介紹下杭州").history(Arrays.asList()).build(); DashScopeResult result = gen.call(param); System.out.println(JsonUtils.toJson(result)); } public static void main(String[] args) { try { usage(); } catch (ApiException | NoApiKeyException | InputRequiredException e) { System.out.println(e.getMessage()); } System.exit(0); } }
通過流式調用
from http import HTTPStatus from dashscope import Generation def call_with_stream(): messages = [ {'role': 'user', 'content': '介紹下杭州?'}] responses = Generation.call( model='chatglm3-6b', messages=messages, result_format='message', # set the result to be "message" format. stream=True, incremental_output=True # get streaming output incrementally ) full_content = '' # with incrementally we need to merge output. for response in responses: if response.status_code == HTTPStatus.OK: full_content = response.output.choices[0]['message']['content'] print(response) else: print('Request id: %s, Status code: %s, error code: %s, error message: %s' % ( response.request_id, response.status_code, response.code, response.message )) print('Full response:\n' + full_content) if __name__ == '__main__': call_with_stream()
// Copyright (c) Alibaba, Inc. and its affiliates. import java.util.Arrays; import java.util.concurrent.Semaphore; import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationResult; import com.alibaba.dashscope.aigc.generation.models.QwenParam; import com.alibaba.dashscope.common.Message; import com.alibaba.dashscope.common.ResultCallback; import com.alibaba.dashscope.common.Role; 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 io.reactivex.Flowable; public class Main { public static void streamCallWithMessage() throws NoApiKeyException, ApiException, InputRequiredException { Generation gen = new Generation(); Message userMsg = Message .builder() .role(Role.USER.getValue()) .content("介紹下杭州?") .build(); QwenParam param = QwenParam.builder().model("chatglm3-6b").messages(Arrays.asList(userMsg)) .resultFormat(QwenParam.ResultFormat.MESSAGE) .topP(0.8) .incrementalOutput(true) // get streaming output incrementally .build(); Flowable<GenerationResult> result = gen.streamCall(param); StringBuilder fullContent = new StringBuilder(); result.blockingForEach(message -> { fullContent.append(message.getOutput().getChoices().get(0).getMessage().getContent()); System.out.println(JsonUtils.toJson(message)); }); System.out.println("Full content: \n" + fullContent.toString()); } public static void streamCallWithCallback() throws NoApiKeyException, ApiException, InputRequiredException,InterruptedException { Generation gen = new Generation(); Message userMsg = Message .builder() .role(Role.USER.getValue()) .content("介紹下杭州?") .build(); QwenParam param = QwenParam .builder() .model("chatglm3-6b") .resultFormat(QwenParam.ResultFormat.MESSAGE) .messages(Arrays.asList(userMsg)) .topP(0.8) .incrementalOutput(true) // get streaming output incrementally .build(); Semaphore semaphore = new Semaphore(0); StringBuilder fullContent = new StringBuilder(); gen.streamCall(param, new ResultCallback<GenerationResult>() { @Override public void onEvent(GenerationResult message) { fullContent.append(message.getOutput().getChoices().get(0).getMessage().getContent()); System.out.println(message); } @Override public void onError(Exception err){ System.out.println(String.format("Exception: %s", err.getMessage())); semaphore.release(); } @Override public void onComplete(){ System.out.println("Completed"); semaphore.release(); } }); semaphore.acquire(); System.out.println("Full content: \n" + fullContent.toString()); } public static void main(String[] args) { try { streamCallWithMessage(); } catch (ApiException | NoApiKeyException | InputRequiredException e) { System.out.println(e.getMessage()); } try { streamCallWithCallback(); } catch (ApiException | NoApiKeyException | InputRequiredException | InterruptedException e) { System.out.println(e.getMessage()); } System.exit(0); } }
參數配置
參數 | 類型 | 默認值 | 說明 |
model | string | - | chatglm-6b-v2/chatglm3-6b。 |
prompt | string | - | 用戶按當前輸入的期望模型執行指令。 |
history | list | [] | 輸入輸出字符串列表。 |
stream (可選) | bool | False | 是否使用流式輸出。當以stream模式輸出結果時,接口返回結果為generator,需要通過迭代獲取結果,默認每次輸出為當前生成的整個序列,最后一次輸出為最終全部生成結果,可以通過參數incremental_output為False改變輸出模式為非增量輸出。 |
incremental_output (可選) | bool | False | 控制流式輸出模式,即后面內容會包含已經輸出的內容;設置為True,將開啟增量輸出模式,后面輸出不會包含已經輸出的內容,您需要自行拼接整體輸出,參考流式輸出示例代碼。 |
messages | list dict | - | 用戶輸入的內容,dict內主要包含2個key:role和content,其中role支持user、assistant、system,content為對應role的text輸入。目前僅chatglm3-6b支持。 |
result_format | string | - | 用戶返回的內容類型,默認為text,當輸入格式為messages時可配置為message。 |
返回結果
非流式返回結果示例
{ "status_code": 200, "request_id": "375d11ad-a8f5-962e-a3fd-32d8f4d17000", "code": "", "message": "", "output": { "text": { "history": [ [ "介紹下杭州", "\n 杭州是中華人民共和國浙江省的省會,位于中國東南沿海地區,地處長江三角洲南翼。杭州擁有悠久的歷史和燦爛的文化,自古以來就是著名的歷史文化名城。杭州的地理位置優越,交通便捷,是長江三角洲地區的重要城市之一。\n\n杭州的氣候屬于亞熱帶季風氣候,四季分明,溫暖濕潤,雨量充沛。全年氣溫適中,平均氣溫在 16-22℃ 之間。杭州的四季風光各具特色,春天的杭州生機盎然,夏天的杭州熱情洋溢,秋天的杭州碩果累累,冬天的杭州銀裝素裹。\n\n杭州是中國著名的旅游勝地,擁有許多著名的旅游景點,如西湖、靈隱寺、宋城、西溪濕地等。此外,杭州還有許多特色美食,如龍井蝦仁、西湖醋魚、東坡肉等。\n\n杭州是中國的互聯網科技產業發達的城市之一,擁有阿里巴巴、網易等知名互聯網公司。此外,杭州還是中國的金融中心之一,擁有許多金融機構和保險公司。\n\n總之,杭州是一個歷史悠久、文化底蘊深厚、風景秀麗、科技發達的城市,是中國重要的經濟、文化和科技中心之一。" ] ], "response": "\n 杭州是中華人民共和國浙江省的省會,位于中國東南沿海地區,地處長江三角洲南翼。杭州擁有悠久的歷史和燦爛的文化,自古以來就是著名的歷史文化名城。杭州的地理位置優越,交通便捷,是長江三角洲地區的重要城市之一。\n\n杭州的氣候屬于亞熱帶季風氣候,四季分明,溫暖濕潤,雨量充沛。全年氣溫適中,平均氣溫在 16-22℃ 之間。杭州的四季風光各具特色,春天的杭州生機盎然,夏天的杭州熱情洋溢,秋天的杭州碩果累累,冬天的杭州銀裝素裹。\n\n杭州是中國著名的旅游勝地,擁有許多著名的旅游景點,如西湖、靈隱寺、宋城、西溪濕地等。此外,杭州還有許多特色美食,如龍井蝦仁、西湖醋魚、東坡肉等。\n\n杭州是中國的互聯網科技產業發達的城市之一,擁有阿里巴巴、網易等知名互聯網公司。此外,杭州還是中國的金融中心之一,擁有許多金融機構和保險公司。\n\n總之,杭州是一個歷史悠久、文化底蘊深厚、風景秀麗、科技發達的城市,是中國重要的經濟、文化和科技中心之一。" } }, "usage": { "input_tokens":4 , "output_tokens": 242 } }
流式返回結果示例
{"status_code": 200, "request_id": "99bc52af-e64f-9a9f-9f47-6673bc99e828", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": "西紅柿牛腩是一道", "content_type": "text"}}]}, "usage": {"input_tokens": 12, "output_tokens": 3}} {"status_code": 200, "request_id": "99bc52af-e64f-9a9f-9f47-6673bc99e828", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": "西紅柿牛腩是一道美味可口的菜肴,以下是制作西紅柿牛肉", "content_type": "text"}}]}, "usage": {"input_tokens": 12, "output_tokens": 11}} ... ... ... ... ... ... ... ... {"status_code": 200, "request_id": "99bc52af-e64f-9a9f-9f47-6673bc99e828", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "西紅柿牛腩是一道美味可口的菜肴,以下是制作西紅柿牛肉的步驟:\n\n所需材料: \n- 牛腩 500克\n - 大西紅柿 4個\n -洋蔥 1個 (切碎)\n -大蒜 3瓣 ,切碎\n -生姜 2片\n -鹽 適量\n -黑胡椒 少許\n -糖 少量\n -醬油 適當\n -水 足夠\n -香菜 若干\n -油 適當的量\n -面粉 適量的量(可選) 用于裹牛肉\n -其他蔬菜(如胡蘿卜、土豆等)可根據個人口味添加\n \n步驟如下: \n1. 將牛腩切成3-4厘米見方的塊,用面粉或玉米淀粉裹好,備用。\n2. 在鍋中加入適量的油,油熱后加入洋蔥、大蒜和生姜,翻炒至洋蔥變透明。 注意不要炒糊。 \n3.加入牛肉塊。用中火將牛肉兩面煎至微黃色。煎好的牛肉取出備用,鍋中油留用。 (如果之前選擇不加面粉,此步驟可以直接進行) 如果牛肉比較大塊的話,這一步可能需要翻煎幾次,確保牛肉熟透。 \n4.在同一個鍋中加入切好的西紅柿塊兒,翻炒均勻,然后加入適量的水,將西紅柿煮爛。加入糖和醬油,攪拌均勻。如果西紅柿比較酸,可以適當加入一些糖來平衡口感。 \n5.將煎過的牛肉重新加入鍋中,轉小火慢慢燉煮,直到牛肉變得非常軟爛,湯汁變得濃稠。期間可以適時嘗味,根據個人口味加鹽和黑胡椒粉。 \n6.燉好的西紅柿牛楠,撒上切好的香菜,即可出鍋。可以搭配米飯或者面食食用。", "content_type": "text"}}]}, "usage": {"input_tokens": 12, "output_tokens": 366}}
返回參數說明
返回參數
類型
說明
status_code
int
200(HTTPStatus.OK)表示請求成功,否則表示請求失敗,可以通過code獲取錯誤碼,通過message字段獲取錯誤詳細信息。
request_Id
string
系統生成的標志本次調用的id。
code
string
表示請求失敗,表示錯誤碼,成功忽略。
message
string
失敗,表示失敗詳細信息,成功忽略。
output
dict
調用結果信息,對于千問模型,包含輸出text。
usage
dict
計量信息,表示本次請求計量數據。
text
dict
模型生成回復以及歷史對話信息,response為本次輸出,history為歷史對話列表。
input_tokens
int
用戶輸入文本轉換成token后的長度,目前都是0,不支持統計。
output_tokens
int
模型生成回復轉換為token后的長度,目前都是0,不支持統計。
HTTP調用接口
功能描述
ChatGLM模型同時支持 HTTP 調用來完成客戶的響應。
前提條件
已開通服務并獲得API-KEY:API-KEY的獲取與配置。
提交接口調用
POST https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
入參描述
傳參方式 | 字段 | 類型 | 必選 | 描述 | 示例值 |
Header | Content-Type | String | 是 | 請求類型:application/json。 | application/json |
Accept | String | 否 | */*,選擇text/event-stream則會開啟 SSE 響應,默認無設置。 | text/event-stream | |
Authorization | String | 是 | API-Key,例如:Bearer d1**2a。 | Bearer d1**2a | |
X-DashScope-SSE | String | 否 | 跟Accept: text/event-stream 二選一即可啟用SSE響應。 | enable | |
Body | model | String | 是 | 指明需要調用的模型。 | chatglm3-6b |
input.prompt | String | 是 | 文本內容,支持中英文。 | 你好 | |
input.history | List | 否 | 用戶與模型的對話歷史。 | [] | |
input.messages | List Dict | 是 | 用戶多輪對話信息輸入。 | [ { "role": "user", "content": "你好" }] | |
parameters.incremental_output | Bool | 否 | 用于控制流式輸出模式,默認false,即后面內容會包含已經輸出的內容;設置為true,將開啟增量輸出模式,后面輸出不會包含已經輸出的內容,您需要自行拼接整體輸出,參考流式輸出示例代碼。 | 無 | |
parameters.result_format | String | 否 |
| text |
出參描述
字段 | 類型 | 描述 | 示例值 |
output.text | Object | 本次請求的算法輸出內容。 | 我建議你去頤和園。 |
request_id | String | 本次請求的系統唯一碼。 | 7574ee8f-38a3-4b1e-9280-11c33ab46e51 |
請求示例(SSE關閉)
以下示例展示通過CURL命令來調用 chatglm3-6b模型的腳本(SSE 關閉)。
需要使用您的API-KEY替換示例中的YOUR-DASHSCOPE-API-KEY
,代碼才能正常運行。
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <YOUR-DASHSCOPE-API-KEY>' \
--header 'Content-Type: application/json' \
--data '{
"model": "chatglm3-6b",
"input":{
"messages":[
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好,請介紹一下故宮"
}
]
},
"parameters": {
"result_format": "message"
}
}'
響應示例(SSE關閉)
{
"output": {
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content_type": "text",
"content": "故宮,位于中國北京市中心,是中國明清兩代的皇家宮殿,也是世界上現存規模最大、保存最為完整的木質結構古建筑之一。故宮始建于明成祖永樂四年(1406年),歷時15年建成。它是明朝和清朝兩代皇帝的皇家居所,共有24位皇帝在此居住和執政。\n\n故宮占地面積72萬平方米,建筑面積約10萬平方米。它共有宮殿建筑990多座,房屋8960間。整個建筑群按照南北中軸線布局,分為外朝和內廷兩部分。外朝天子殿、中和殿和保和殿組成,是皇帝舉行盛大典禮和處理政務的地方;內庭包括乾清宮、坤寧宮和儲秀宮等,為皇帝和皇后居住的地方,同時也是皇帝處理日常政務的場所。此外,故宮還有御花園、東西六宮等眾多宮殿和建筑。"
}
}
]
},
"usage": {
"output_tokens": 180,
"input_tokens": 11
},
"request_id": "3719bbfa-0ab8-997d-9207-21355f7320b3"
}
請求示例(SSE開啟)
以下示例展示通過CURL命令來調用 chatglm3-6b模型的腳本(SSE 關閉)。
需要使用您的API-KEY替換示例中的YOUR-DASHSCOPE-API-KEY
,代碼才能正常運行。
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <YOUR-DASHSCOPE-API-KEY>' \
--header 'Content-Type: application/json' \
--header 'X-DashScope-SSE: enable' \
--data '{
"model": "chatglm3-6b",
"input":{
"messages":[
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好,請介紹一下故宮"
}
]
},
"parameters": {
"result_format": "message"
}
}'
響應示例(SSE開啟)
id:1
event:result
data:{"output":{"finish_reason":"null","text":"\n "},"usage":{"output_tokens":3,"input_tokens":15},"request_id":"1117fb64-5dd9-9df0-a5ca-d7ee0e97032d"}
id:2
event:result
data:{"output":{"finish_reason":"null","text":"\n 故宮(The Forbidden City)"},"usage":{"output_tokens":12,"input_tokens":15},"request_id":"1117fb64-5dd9-9df0-a5ca-d7ee0e97032d"}
... ... ... ...
... ... ... ...
id:25
event:result
data:{"output":{"finish_reason":"stop","text":"\n 故宮(The Forbidden City)是中國明清兩代的皇宮,位于北京市中心,是世界上最大、保存最為完整的木質結構古建筑之一。故宮于明成祖永樂四年(1406年)開始建設,歷經14年方告完成,共有9800余間房屋、300多座建筑。故宮以其豐富的文化遺產、精美的建筑藝術和悠久的歷史而聞名于世界。\n\n故宮是中國古代宮殿建筑之精華,其建筑風格、布局嚴謹、精美、華麗,色彩斑斕,富麗堂皇。故宮也是世界上保存最完整、規模最宏大的古代木質結構建筑群之一,其建筑精美、色彩斑斕,富有變化和層次感,堪稱中國古代建筑藝術的杰作。\n\n除此之外,故宮還有眾多珍貴的文物和藝術品,包括古代瓷器、書畫、玉器、金銀器等,是中國和世界文化遺產的重要代表之一。"},"usage":{"output_tokens":190,"input_tokens":12},"request_id":"1117fb64-5dd9-9df0-a5ca-d7ee0e97032d"}
}
異常響應示例
在訪問請求出錯的情況下,輸出結果中會通過code
和message
指明出錯原因。
{
"code":"InvalidApiKey",
"message":"Invalid API-key provided.",
"request_id":"fb53c4ec-1c12-4fc4-a580-cdb7c3261fc1"
}
狀態碼說明
DashScope通用狀態碼請查閱:返回狀態碼說明。