图像
一条记忆可以携带一张图像。引擎会为图片建立索引,因此即使记录没有说明文字、标题或替代文本,任何语言的文本查询都能匹配到它。
Tablet 2 及更新版本支持。未实现图像功能的引擎会指名说明,而不是仅返回一个 404,因此可以区分功能缺失与记忆缺失。支持 JPEG、PNG、GIF 和 WebP。
存储图像
在普通的 add 调用中传入 image 对象。content 可以为空,此时图像本身即可被检索。
mem.add("at the beach", image={"data": b64}) # caption + image
mem.add("", image={"data": b64}) # the image IS the memorydata 为必填。data:image/jpeg;base64, 前缀,以及 base64 和 openssl 添加的换行,都会被自动去除。
| 字段 | 作用 |
|---|---|
| data | 图片的 Base64 编码。必填。大小上限是服务端配置,而非 SDK 常量,/health 以 memory.images.max_bytes 报告该值。 |
| reference | 你自己保存的原图所在位置。以字符串形式存储,我们不会去获取它。我们保存的是缩小后的图,原件就该放在这里。 |
| taken_at | RFC3339 格式,通常来自 EXIF。当 event_date 为空时填充该字段,使记忆按拍摄时间而非上传时间排序。 |
查找图像
没有单独的图像检索接口。search 和 recall 会将图像与文本一并返回,并统一排序。
操作已有的图像
data, mime = mem.get_image(memory_id=mid)
page = mem.list_images(limit=50) # page["count"] = store total
mem.forget_image(memory_id=mid, preview=True)| 调用 | 作用 |
|---|---|
| get_image | 我们保存的那张图,形式为 (bytes, content_type),不一定是你上传的原件。长边超过 1,568 px 的图像会被缩小后保存,并且除 JPEG 外都会重新编码为 WebP,所以上传 PNG 取回的是 image/webp。类型由字节内容嗅探得出,而非取自上传时的文件名,因此请按 content_type 来命名文件。没有图像的记忆会抛出异常,而不是返回空内容。 |
| list_images | 返回一页结果,按时间由新到旧,并附带 count,即该存储库的总数,而非本页条数。分页采用游标方式:把 next_before 和 next_skip_ids 回传。两者都必须传,因为图像可能共用同一时间戳。 |
| forget_image | 删除图像并保留文本。没有说明文字的图像本身就是这条记忆,这种情况下记忆也会一并删除。 |
向 forget_image 传入 preview=True,可在不做任何改动的情况下取得 memory_kept。iter_images 会自动翻页。
一张图像的费用
图像与文本使用同一单位的令牌计费。令牌 = 像素面积 / 556.7。长边超过 1,568 px 时按 1,568 px 计数,因此 2,500 px 的图像与 1,568 px 的图像花费相同。
| 图像 | 计量尺寸 | Token 数 |
|---|---|---|
| 700 × 700 | as sent | 881 |
| 1000 × 1000 | as sent | 1,797 |
| 1568 × 1568 | as sent | 4,417 |
| 1920 × 1080 | 1568 × 882 | 2,485 |
| 2500 × 1875 | 1568 × 1176 | 3,313 |
| 2500 × 2500 | 1568 × 1568 | 4,417 |
单张图像的上限为 4,417 个令牌。调用前我们会按这个上限从余额中预留,调用后按实测值扣费,实测值绝不会更高。
我们保存的不是原图,而是缩到记忆分辨率的那张图。长边超过 1,568 px 时,图像在进入时就被缩小到 1,568 px,之后用于索引、存储和返回的都是这张缩小图。缩小意味着重新编码,因此无损格式一律写为 WebP:2,500 px 的 PNG 会以 1,568 px 的
image/webp 返回。JPEG 仍是 JPEG,1,568 px 以下的字节不作改动。(如果重新编码后文件反而更大,我们就原样保留你的字节。)两条边仍须 ≥ 700 px,长边 ≤ 2,500 px,超出范围会以 400 拒绝——低于 700 px 时按固定下限计费,更小的图像存储费用相同;超过 2,500 px 我们根本不会解码该文件。若需要完整分辨率的文件,请自行保留一份副本,或把它的地址放进 reference。返回数量
默认 1,每次响应最多 5 张图像。五张图像接近 20,000 个 token。
| 字段 | 作用 |
|---|---|
| max_images | 0 到 5。单次响应可携带的图像数量。默认 1。0 表示只返回文本。超出范围会被拒绝,而不是截断到边界值。 |
为图像附加英文说明会提升英文查询的效果,并降低其他语言查询的效果,在十四种语言上平均使 recall@5 下降 11.4 个百分点。如果你的用户使用多种语言检索,存储图像时不要附加说明文字。