2024年,相比于文本,多模态的进步是非常出乎意料的,利用多模态模型,我们可以很轻松的完成一些非常酷的事情。
比如说,我们想做一个结构化的抽取,我们可能有一张图片,然后让一个agent从中提取相关的营养信息。
现在,可以轻松实现!
在今天的文章中,我们将快速过一遍如何在实际操作中完成这个任务。
这里使用Atomic Agents 框架的教程代码。
假设我们有一些图片,比如说下图的营养表

就像上面展示的那些。 无论它们是像左边那样干净的扫描件或数字化图像,还是只是一张牛奶盒的照片,现在多模态大模型都可以处理。
那么,废话不多说,我们先定义一个包含所有我们想提取字段的schema:
class NutritionLabel(BaseIOSchema):
"""表示食品标签的完整营养信息"""
calories: int = Field(..., description="每份卡路里")
total_fat: float = Field(..., description="总脂肪(克)")
saturated_fat: float = Field(..., description="饱和脂肪(克)")
trans_fat: float = Field(..., description="反式脂肪(克)")
cholesterol: int = Field(..., description="胆固醇(毫克)")
sodium: int = Field(..., description="钠(毫克)")
total_carbohydrates: float = Field(..., description="总碳水化合物(克)")
dietary_fiber: float = Field(..., description="膳食纤维(克)")
total_sugars: float = Field(..., description="总糖(克)")
added_sugars: float = Field(..., description="添加糖(克)")
protein: float = Field(..., description="蛋白质(克)")
vitamin_d: float = Field(..., description="维生素D(微克)")
calcium: int = Field(..., description="钙(毫克)")
iron: float = Field(..., description="铁(毫克)")
potassium: int = Field(..., description="钾(毫克)")
serving_size: str = Field(..., description="该产品的单份份量")
servings_per_container: float = Field(..., description="包装中包含的份数")
product_name: str = Field(
...,
description="食品/饮料的完整名称或类型描述。例如:'可口可乐','百事可乐M','烟熏培根','伊利牛奶'",
)
注意,每个字段都有一个描述,其中也描述了计量单位——这对保证一致性很重要,因为这些描述会发送给LLM,LLM会把这些考虑进去!
现在,当然我们可能希望批量处理多个图像——我们可以通过定义一个属性来实现,这个属性将是一个instructor.Image类型的列表。
就像这样:
class NutritionAnalysisInput(BaseIOSchema):
"""营养标签分析的输入schema"""
instruction_text: str = Field(..., description="分析营养标签的指令")
images: List[instructor.Image] = Field(..., description="要分析的营养标签图片")
class NutritionAnalysisOutput(BaseIOSchema):
"""包含提取的营养信息的输出schema"""
analyzed_labels: List[NutritionLabel] = Field(
..., description="从提供的图片中提取的营养标签列表"
)
所以,我们agent最终的输入schema是一个带有图片列表的指令,而预期的输出是一个营养标签信息对象列表。
实际上,就是这样了。如果我们把这些组合起来,会得到如下结果:
from atomic_agents.agents.base_agent import BaseAgent, BaseAgentConfig
from atomic_agents.lib.base.base_io_schema import BaseIOSchema
from atomic_agents.lib.components.system_prompt_generator import SystemPromptGenerator
import instructor
import openai
from pydantic import Field
from typing import List
import os
# API Key 设置
API_KEY = ""
ifnot API_KEY:
API_KEY = os.getenv("OPENAI_API_KEY")
ifnot API_KEY:
raise ValueError(
"未设置 API 密钥。请将 API 密钥设置为静态变量或环境变量 OPENAI_API_KEY。"
)
class NutritionLabel(BaseIOSchema):
"""表示食品标签的完整营养信息"""
calories: int = Field(..., description="每份卡路里")
total_fat: float = Field(..., description="总脂肪(克)")
saturated_fat: float = Field(..., description="饱和脂肪(克)")
trans_fat: float = Field(..., description="反式脂肪(克)")
cholesterol: int = Field(..., description="胆固醇(毫克)")
sodium: int = Field(..., description="钠(毫克)")
total_carbohydrates: float = Field(..., description="总碳水化合物(克)")
dietary_fiber: float = Field(..., description="膳食纤维(克)")
total_sugars: float = Field(..., description="总糖(克)")
added_sugars: float = Field(..., description="添加糖(克)")
protein: float = Field(..., description="蛋白质(克)")
vitamin_d: float = Field(..., description="维生素D(微克)")
calcium: int = Field(..., description="钙(毫克)")
iron: float = Field(..., description="铁(毫克)")
potassium: int = Field(..., description="钾(毫克)")
serving_size: str = Field(..., description="该产品的单份份量")
servings_per_container: float = Field(..., description="包装中包含的份数")
product_name: str = Field(
...,
description="食品/饮料的完整名称或类型描述。例如:'可口可乐轻怡','百事可乐MAX','烟熏培根','基安蒂葡萄酒'",
)
class NutritionAnalysisInput(BaseIOSchema):
"""营养标签分析的输入schema"""
instruction_text: str = Field(..., description="分析营养标签的指令")
images: List[instructor.Image] = Field(..., description="要分析的营养标签图片")
class NutritionAnalysisOutput(BaseIOSchema):
"""包含提取的营养信息的输出schema"""
analyzed_labels: List[NutritionLabel] = Field(
..., description="从提供的图片中提取的营养标签列表"
)
# 配置营养分析系统
nutrition_analyzer = BaseAgent(
config=BaseAgentConfig(
client=instructor.from_openai(openai.OpenAI(api_key=API_KEY)),
model="gpt-4o-mini",
system_prompt_generator=SystemPromptGenerator(
background=[
"你是一个专业的营养标签分析器。",
"你擅长从食品标签图片中提取精确的营养信息。",
"你了解各种份量大小格式和计量单位。",
"你可以同时处理多个营养标签。",
],
steps=[
"对于每张营养标签图片:",
"1. 定位并识别营养成分表",
"2. 提取所有的份量信息和营养值",
"3. 验证测量值和单位的准确性",
"4. 将营养成分编译为结构化数据",
],
output_instructions=[
"对于每个分析过的营养标签:",
"1. 记录完整的份量大小信息",
"2. 提取所有具有正确单位的营养素值",
"3. 确保所有测量值都已正确转换",
"4. 将所有提取的标签包含在最终结果中",
],
),
input_schema=NutritionAnalysisInput,
output_schema=NutritionAnalysisOutput,
)
)
def main():
print("开始营养标签分析...")
# 构建测试图片的路径
script_directory = os.path.dirname(os.path.abspath(__file__))
test_images_directory = os.path.join(os.path.dirname(script_directory), "test_images")
image_path_1 = os.path.join(test_images_directory, "nutrition_label_1.png")
image_path_2 = os.path.join(test_images_directory, "nutrition_label_2.jpg")
# 创建并提交分析请求
analysis_request = NutritionAnalysisInput(
instruction_text="请分析这些营养标签并提取所有营养信息。",
images=[instructor.Image.from_path(image_path_1), instructor.Image.from_path(image_path_2)],
)
try:
# 处理营养标签
print("正在分析营养标签...")
analysis_result = nutrition_analyzer.run(analysis_request)
print("分析已成功完成")
# 显示结果
for i, label in enumerate(analysis_result.analyzed_labels, 1):
print(f"\n营养标签 {i}:")
print(f"产品名称: {label.product_name}")
print(f"份量大小: {label.serving_size}")
print(f"每包份数: {label.servings_per_container}")
print(f"卡路里: {label.calories}")
print(f"总脂肪: {label.total_fat}g")
print(f"饱和脂肪: {label.saturated_fat}g")
print(f"反式脂肪: {label.trans_fat}g")
print(f"胆固醇: {label.cholesterol}mg")
print(f"钠: {label.sodium}mg")
print(f"总碳水化合物: {label.total_carbohydrates}g")
print(f"膳食纤维: {label.dietary_fiber}g")
print(f"总糖: {label.total_sugars}g")
print(f"添加糖: {label.added_sugars}g")
print(f"蛋白质: {label.protein}g")
print(f"维生素D: {label.vitamin_d}mcg")
print(f"钙: {label.calcium}mg")
print(f"铁: {label.iron}mg")
print(f"钾: {label.potassium}mg")
except Exception as e:
print(f"分析失败: {str(e)}")
raise
if __name__ == "__main__":
main()
当然,这里不仅限于使用OpenAI的模型,但我发现OpenAI的gpt-4o-mini在这项工作上表现非常出色。我也用新的Gemini 2.0模型测试过,效果也非常好!
如何系统学习掌握AI大模型?
AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。
学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。
这里给大家精心整理了一份
全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

1. 成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

2. 大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

3. 大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

4. 2024行业报告
行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5. 大模型项目实战
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

6. 大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以
微信扫描下方优快云官方认证二维码,免费领取【保证100%免费】

776

被折叠的 条评论
为什么被折叠?



