Llama(输入文本和图像)模型
目前Llama系列模型不仅能够处理文本数据,还能够处理图像数据;Llama3.2的部分模型加入了视觉理解的功能,该模型支持同时输入文本和图像数据,对图像进行理解并输出文本信息;关于Llama系列中仅文本输入的模型详情,请阅读Llama模型(仅文本输入)API参考。
如何使用
前提条件
您需要已获取API Key并配置API Key到环境变量。如果通过SDK调用,还需要安装DashScope SDK。
您需要已在百炼平台的模型广场申请Llama(输入文本和图像)模型的调用权限。
注:下文以llama3.2-text-image来表示Llama(输入文本和图像)模型。
简单示例
您可以通过DashScope SDK或HTTP方式调用llama3.2-text-image模型,体验单轮对话的功能。
Python
示例代码
from http import HTTPStatus
import os
import dashscope
def call_with_messages():
messages = [
{
"role": "user",
"content": [
{"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
{"text": "这是什么,请用中文回答?"}
]
}
]
response = dashscope.MultiModalConversation.call(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='llama3.2-90b-vision-instruct',
messages=messages,
)
if response.status_code == HTTPStatus.OK:
print(response.output.choices[0].message.content[0]["text"])
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
if __name__ == '__main__':
call_with_messages()
返回结果
这是一张照片,照片中是一只狗和一个女孩在海滩上互动。狗坐在沙滩上,伸出前爪,好像在和女孩握手。女孩也伸出手,好像在和狗握手。他们的表情都很开心,好像在玩游戏。背景是海滩和大海,天气看起来很好。整体来说,这张照片很温馨,好像是在记录一只狗和它的主人之间的亲密关系。
输入参数
model | 模型名称。 |
messages | 由历史对话组成的消息列表,有以下三种消息类型: 系统消息:用于指定模型的目标或角色。如果设置系统消息,请放在messages列表的第一位。 用户消息:输入给模型的文本、图像信息。llama3.2-text-image模型不支持纯文本输入,即用户信息中,必须存在图像的URL链接。 助手消息:模型对用户消息的回复。您也可以预先填写助手消息,作为后续助手消息的示例。 |
max_new_tokens | 模型输出的最大token数,默认值为512。 |
top_p | 用于控制模型生成文本的多样性,为可选值,取值范围:(0,1.0],默认值为1.0。 |
temperature | 表示采样温度,用于控制模型生成文本的多样性。temperature越高,生成的文本更多样,反之,生成的文本更确定。取值大于等于0,默认值为0.8。 |
top_k | 表示生成过程中采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个Token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。取值为None或当top_k大于100时,表示不启用top_k策略,此时仅有top_p策略生效。 |
注:通过HTTP调用时,请将messages放入input对象中,将top_p、temperature、top_k、min_new_tokens、max_new_tokens参数放入parameters对象中。 |
输出参数
返回参数 | 类型 | 说明 |
status_code | integer | 200(HTTPStatus.OK)表示请求成功,否则表示请求失败,可以通过code获取错误码,通过message字段获取错误详细信息。 |
request_Id | string | 系统生成的标志本次调用的id。 |
code | string | 表示请求失败,表示错误码,成功忽略。 |
message | string | 失败,表示失败详细信息,成功忽略。 |
output | object | 调用结果信息,对于Llama2模型,包含输出text。 |
output.text | string | 模型生成回复。 |
usage.input_tokens | integer | 用户输入的文本和图像转换成Token后的长度。 |
usage.output_tokens | integer | 模型生成回复转换为Token后的长度。 |
Java
示例代码
import java.util.Arrays;
import java.util.Collections;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.JsonUtils;
public class Main {
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
Collections.singletonMap("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"),
Collections.singletonMap("text", "这是什么?"))).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.model("llama3.2-90b-vision-instruct")
.message(userMessage)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
返回结果
这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。
curl
示例代码
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "llama3.2-90b-vision-instruct",
"input":{
"messages":[
{
"role": "user",
"content": [
{"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
{"text": "这是什么?"}
]
}
]
}
}'
返回结果
{
"output": {
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [
{
"text": "这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。"
}
]
}
}
]
},
"usage": {
"output_tokens": 79,
"input_tokens": 45
},
"request_id": "c3e73869-77a5-9f29-a1cf-a42b7800805f"
}
多轮对话(参考历史对话信息)
llama3.2-text-image模型可以参考历史对话信息进行回复;您可以参考以下示例代码,通过DashScope SDK或HTTP方式,调用llama3.2-text-image模型,实现多轮对话的功能。
Python
示例代码
import os
from dashscope import MultiModalConversation
messages = [
{
"role": "user",
"content": [
{
"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"
},
{"text": "这是什么?"},
],
}
]
response = MultiModalConversation.call(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='llama3.2-90b-vision-instruct',
messages=messages)
print(f"模型第一轮输出:{response.output.choices[0].message.content[0]['text']}")
messages.append(response['output']['choices'][0]['message'])
user_msg = {"role": "user", "content": [{"text": "做一首诗描述这个场景"}]}
messages.append(user_msg)
response = MultiModalConversation.call(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='llama3.2-90b-vision-instruct',
messages=messages)
print(f"模型第二轮输出:{response.output.choices[0].message.content[0]['text']}")
返回结果
模型第一轮输出:这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。
模型第二轮输出:海滩上的女孩和狗,
握手,笑容满面。
狗的爪子,女孩的手,
一起握紧,心心相连。
海浪拍打,沙滩上,
女孩和狗,享受幸福。
他们的笑声,海浪的声,
融合在一起,幸福的旋律。
Java
示例代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
public class Main {
private static final String modelName = "llama3.2-90b-vision-instruct";
public static void MultiRoundConversationCall() throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
MultiModalMessage systemMessage = MultiModalMessage.builder().role(Role.SYSTEM.getValue())
.content(Arrays.asList(Collections.singletonMap("text", "You are a helpful assistant."))).build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(Collections.singletonMap("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"),
Collections.singletonMap("text", "这是什么?"))).build();
List<MultiModalMessage> messages = new ArrayList<>();
messages.add(systemMessage);
messages.add(userMessage);
MultiModalConversationParam param = MultiModalConversationParam.builder()
// 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY")) .model(modelName)
.messages(messages)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println("第一轮输出:"+result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text")); // add the result to conversation
messages.add(result.getOutput().getChoices().get(0).getMessage());
MultiModalMessage msg = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(Collections.singletonMap("text", "做一首诗描述这个场景"))).build();
messages.add(msg);
param.setMessages((List)messages);
result = conv.call(param);
System.out.println("第二轮输出:"+result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text")); }
public static void main(String[] args) {
try {
MultiRoundConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
返回结果
第一轮输出:这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。
第二轮输出:海滩上的女孩和狗,
握手,笑容满面。
狗的爪子,女孩的手,
一起握紧,心心相连。
海浪拍打,沙滩上,
女孩和狗,享受幸福。
他们的笑声,海浪的声,
融合在一起,幸福的旋律。
curl
示例代码
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "llama3.2-90b-vision-instruct",
"input":{
"messages":[
{
"role": "user",
"content": [
{"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
{"text": "这是什么?"}
]
},
{
"role": "assistant",
"content": [
{"text": "这是一只小狗和一个女孩在海边。"}
]
},
{
"role": "user",
"content": [
{"text": "做一首诗描述这个场景"}
]
}
]
}
}'
返回结果
{
"output": {
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [
{
"text": "海边小狗嬉戏,女孩笑容如花。\n\n小狗摇尾巴,女孩抚摸它的头。\n\n海浪拍打岸边,女孩和小狗一起玩耍。\n\n夕阳西下,女孩和小狗一起享受美丽的时刻。"
}
]
}
}
]
},
"usage": {
"output_tokens": 66,
"input_tokens": 81
},
"request_id": "46fbf222-09b1-95cb-978a-621cc463b9a0"
}
流式输出
大模型并不是一次性生成最终结果,而是逐步地生成中间结果,最终结果由中间结果拼接而成。使用非流式输出方式需要等待模型生成结束后再将生成的中间结果拼接后返回,而流式输出可以实时地将中间结果返回,您可以在模型进行输出的同时进行阅读,减少等待模型回复的时间。
您可以参考以下代码,通过DashScope SDK或HTTP方式,体验流式输出的功能。
在Python SDK中请通过设置stream为True来实现流式输出,在Java SDK中实现流式输出请通过streamCall
接口调用;通过HTTP实现流式输出请在Header中指定X-DashScope-SSE
为enable
。 目前DashScope SDK或HTTP方式均不支持incremental_output增量输出。
Python
示例代码
import os
from dashscope import MultiModalConversation
messages = [
{
"role": "user",
"content": [
{"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
{"text": "这是什么?"}
]
}
]
responses = MultiModalConversation.call(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv("DASHSCOPE_API_KEY"),
model='llama3.2-90b-vision-instruct', #'llama3.2-90b-vision-instruct',
messages=messages,
stream=True)
print("流式输出内容为:")
for response in responses:
print(response["output"])
返回结果
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这"}]}}]}
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这是一"}]}}]}
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这是一张"}]}}]}
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这是一张照片"}]}}]}
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这是一张照片,"}]}}]}
......
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好"}]}}]}
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"text": "这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。"}]}}]}
{"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": [{"text": "这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。"}]}}]}
Java
示例代码
import java.util.Arrays;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.google.gson.Gson;
import io.reactivex.Flowable;
public class Main {
public static void streamCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
// must create mutable map.
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(new HashMap<String, Object>(){{put("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg");}},
new HashMap<String, Object>(){{put("text", "这是什么");}})).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
// 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("llama3.2-90b-vision-instruct")
.message(userMessage)
.build();
Flowable<MultiModalConversationResult> result = conv.streamCall(param);
Gson gson = new Gson();
result.blockingForEach(item -> {
try {
System.out.println(gson.toJson(item.getOutput()));
} catch (Exception e){
System.exit(0);
}
});
}
public static void main(String[] args) {
try {
streamCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
返回结果
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这"}]}}]}
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这是一"}]}}]}
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这是一张"}]}}]}
......
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这是一张照片,照片中是一只狗和一个女孩坐在沙滩上。狗伸出前爪,女孩也伸出手,两人似乎正在互动。背景是沙滩和"}]}}]}
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这是一张照片,照片中是一只狗和一个女孩坐在沙滩上。狗伸出前爪,女孩也伸出手,两人似乎正在互动。背景是沙滩和海"}]}}]}
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这是一张照片,照片中是一只狗和一个女孩坐在沙滩上。狗伸出前爪,女孩也伸出手,两人似乎正在互动。背景是沙滩和海浪"}]}}]}
{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"text":"这是一张照片,照片中是一只狗和一个女孩坐在沙滩上。狗伸出前爪,女孩也伸出手,两人似乎正在互动。背景是沙滩和海浪。"}]}}]}
{"choices":[{"finish_reason":"stop","message":{"role":"assistant","content":[{"text":"这是一张照片,照片中是一只狗和一个女孩坐在沙滩上。狗伸出前爪,女孩也伸出手,两人似乎正在互动。背景是沙滩和海浪。"}]}}]}
curl
示例代码
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'X-DashScope-SSE: enable' \
-d '{
"model": "llama3.2-90b-vision-instruct",
"input":{
"messages":[
{
"role": "system",
"content": [
{"text": "You are a helpful assistant."}
]
},
{
"role": "user",
"content": [
{"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
{"text": "这是什么?"}
]
}
]
}
}'
返回结果
id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"这"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":45,"output_tokens":1},"request_id":"27f2d0c7-27f2-9657-a164-818e80c012e3"}
id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"这是一"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":45,"output_tokens":2},"request_id":"27f2d0c7-27f2-9657-a164-818e80c012e3"}
......
id:79
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":45,"output_tokens":79},"request_id":"27f2d0c7-27f2-9657-a164-818e80c012e3"}
id:80
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"这是一张照片,照片中有一个女孩和一只狗。女孩坐在沙滩上,狗坐在她旁边。女孩伸出手,狗也伸出爪子,好像在和女孩握手。女孩和狗都很开心的样子。背景是海滩和海洋,天气看起来很好。"}],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"input_tokens":45,"output_tokens":79},"request_id":"27f2d0c7-27f2-9657-a164-818e80c012e3"}
支持的图片
图片格式 | Content Type | 文件扩展名 |
BMP | image/bmp | .bmp |
DIB | image/bmp | .dib |
ICNS | image/icns | .icns |
ICO | image/x-icon | .ico |
JPEG | image/jpeg | .jfif, .jpe, .jpeg, .jpg |
JPEG2000 | image/jp2 | .j2c, .j2k, .jp2, .jpc, .jpf, .jpx |
PNG | image/png | .apng, .png |
SGI | image/sgi | .bw, .rgb, .rgba, .sgi |
TIFF | image/tiff | .tif, .tiff |
WEBP | image/webp | .webp |
对于输入的图片有以下限制:
图片文件大小不超过10MB。
模型列表、计费和免费额度
模型名称 |
上下文长度 |
输入输出成本 |
免费额度 |
(Token数) |
|||
llama3.2-90b-vision-instruct |
8192 |
目前仅供免费体验。 免费额度用完后不可调用,敬请关注后续动态。 |
100万Token(需申请) 有效期:百炼开通后180天内。 |
llama3.2-11b-vision |
常见问题
我可以删除已上传的图片吗?
答:在模型完成文本生成后,百炼服务器会自动将图片删除,无需手动删除。
llama3.2-text-image模型是否支持理解视频内容?
答:llama3.2-text-image目前不支持传入视频文件,也不支持传入图片列表。
llama3.2-text-image模型是否支持本地文件?
答:llama3.2-text-image目前不支持本地文件传入。