多模态内容
多模态内容指不同类型的内容,例如文本、图像、音频、视频和文件。
Koog允许您在user消息中向LLM发送图像、音频、视频和文件以及文本。
您可以通过使用Kotlin中的相应函数或Java中的方法将它们添加到user消息中:
image():附加图像(JPG、PNG、WebP、GIF)。audio():附加音频文件(MP3、WAV、FLAC)。video():附加视频文件(MP4、AVI、MOV)。file()/binaryFile()/textFile():附加文档(PDF、TXT、MD等)。
每个函数或方法支持两种配置附件参数的方式,因此您可以:
- 将URL或文件路径传递给函数或方法,它会自动处理附件参数。对于
file()、binaryFile()和textFile(),您还必须提供MIME类型。 - 创建
ContentPart对象并将其传递给函数或方法,以自定义控制附件参数。
Note
多模态内容支持因LLM提供商而异。 请查阅提供商文档以了解支持的内容类型。
自动配置的附件
如果您将URL或文件路径传递给附件函数或方法,Koog会根据文件扩展名自动构建相应的附件参数。
包含文本消息和自动配置附件列表的user消息的一般格式如下:
在Kotlin中,+运算符将文本内容与附件一起添加到用户消息中。在Java中,使用ContentPartsBuilder的text()方法。
自定义配置的附件
ContentPart接口允许您为每个附件单独配置参数。
所有附件都实现了ContentPart.Attachment接口。
您可以为每个附件创建特定实现的实例,配置其参数,并将其传递给Kotlin中的相应image()、audio()、video()或file()函数,或Java中的方法。包含文本消息和自定义配置附件列表的 user 消息通用格式如下:
Koog 为每种媒体类型提供了以下实现 ContentPart.Attachment 接口的专用类:
ContentPart.Image:图像附件,例如 JPG 或 PNG 文件。ContentPart.Audio:音频附件,例如 MP3 或 WAV 文件。ContentPart.Video:视频附件,例如 MP4 或 AVI 文件。ContentPart.File:文件附件,例如 PDF 或 TXT 文件。
所有 ContentPart.Attachment 类型均接受以下参数:| 名称 | 数据类型 | 必填 | 描述 |
|------------|--------------------------------------------------------------------------------------------------------------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| content | AttachmentContent | 是 | 所提供文件内容的来源。 |
| format | 字符串 | 是 | 所提供文件的格式。例如 png。 |
| mimeType | 字符串 | 仅适用于 ContentPart.File | 所提供文件的 MIME 类型。
对于 ContentPart.Image、ContentPart.Audio 和 ContentPart.Video,默认为 <type>/<format>(例如 image/png)。
对于 ContentPart.File,必须显式提供。 |
| fileName | 字符串? | 否 | 所提供文件的名称(包含扩展名)。例如 screenshot.png。 |
附件内容
AttachmentContent 接口的实现定义了作为输入提供给 LLM 的内容类型和来源:
-
AttachmentContent.URL定义所提供内容的 URL: -
AttachmentContent.Binary.Bytes将文件内容定义为字节数组: -
AttachmentContent.Binary.Base64将文件内容定义为包含文件数据的 Base64 编码字符串: -
AttachmentContent.PlainText将文件内容定义为纯文本(仅适用于ContentPart.File):
混合附件除了在单独的提示或消息中提供不同类型的附件外,您还可以在单个 user() 消息中提供多种混合类型的附件:
Prompt prompt = Prompt.builder("mixed_content_example")
.system("You are a helpful assistant.")
.user(List.of(
new ContentPart.Text("Please analyze this image and the attached document."),
new ContentPart.Image(
new AttachmentContent.URL("https://example.com/image.png"),
"png",
"image/png",
"image.png"
),
new ContentPart.File(
new AttachmentContent.URL("https://example.com/document.pdf"),
"pdf",
"application/pdf",
"document.pdf"
),
new ContentPart.Text("Summarize the differences.")
))
.build();