跳到主要内容

agentchat.contrib.capabilities.vision_capability

视觉能力

class VisionCapability(AgentCapability)

我们可以为常规的ConversableAgent添加视觉能力,即使该代理没有多模态能力,例如GPT-3.5-turbo代理、Llama、Orca或Mistral代理。这种视觉能力将调用一个LMM客户端来描述图像(生成标题),然后再将信息发送给代理的实际客户端。

视觉功能将连接到 ConversableAgent 的 process_last_received_message

一些技术细节: 当具有视觉能力的代理接收到消息时,它会:

  1. _process_received_message: a. _append_oai_message
  2. generate_reply: 如果代理是MultimodalAgent,它也将使用图像标签。 a. 钩子 process_last_received_message (注意:这是视觉能力将被挂接的地方。) b. 钩子 process_all_messages_before_reply
  3. 发送: a. hook process_message_before_send b. _append_oai_message

__init__

def __init__(lmm_config: Dict,
description_prompt: Optional[str] = DEFAULT_DESCRIPTION_PROMPT,
custom_caption_func: Callable = None) -> None

初始化一个新实例,设置与语言多模态(LMM)客户端交互的配置,并指定图像描述和字幕的可选参数。

参数:

  • lmm_config Dict - LMM客户端的配置,用于调用LMM服务以描述图像。这必须是一个包含必要配置参数的字典。如果lmm_config为False或空字典,则视为无效,初始化时将断言。
  • description_prompt Optional[str], optional - 用于生成图像描述的提示。此参数允许自定义传递给LMM服务的提示。如果未提供,则默认为DEFAULT_DESCRIPTION_PROMPT
  • custom_caption_func Callable, optional - A callable that, if provided, will be used to generate captions for images. This allows for custom captioning logic outside of the standard LMM service interaction. The callable should take three parameters as input:
    1. 图片的URL(或本地位置)
    2. image_data (一个PIL图像)
    3. lmm_client(用于调用远程LMM) 然后返回一个描述(作为字符串)。 如果未提供,将依赖于通过lmm_config配置的LMM客户端进行字幕生成。 如果提供,我们将不运行默认的self._get_image_caption方法。

引发:

  • AssertionError - 如果既没有提供有效的lmm_config,也没有提供有效的custom_caption_func, 将抛出AssertionError以指示Vision Capability需要其中一项有效才能操作。

处理最后接收到的消息

def process_last_received_message(content: Union[str, List[dict]]) -> str

通过标准化和增强任何包含图像的描述来处理最后接收到的消息内容。该函数支持将输入内容作为字符串或字典列表,其中每个字典表示一个内容项(例如,文本、图像)。如果内容包含图像URL,它会获取图像数据,为每个图像生成标题,并将标题插入增强后的内容中。

该函数旨在将内容转换为与GPT-4V多模态输入兼容的格式,具体来说,如果需要,将字符串格式化为PIL兼容的图像,并为图像附加文本描述。这使得内容呈现更加易于理解,特别是在图像无法直接显示的上下文中。

参数:

  • content Union[str, List[dict]] - 最后接收到的消息内容,可以是纯文本字符串或表示不同类型内容项(例如,文本、image_url)的字典列表。

返回:

  • str - 增强的消息内容

引发:

  • AssertionError - 如果内容列表中的某个项目不是字典。

示例:

假设 self._get_image_caption(img_data) 为该图像返回“山间美丽的日落”。

  • 输入为字符串: content = "Check out this cool photo!"

  • Output - "看看这张很酷的照片!" (内容是一个没有图像的字符串,保持不变。)

    • 输入为字符串,包含图片位置: content = "这张酷照片中的天气是什么:http://example.com/photo.jpg>"
  • Output - "这张酷照片中的天气是什么:http://example.com/photo.jpg> 如果你无法看到,这张图片的标题是: 山上的美丽日落 " (图片后添加的标题)

    • 输入为仅包含文本的列表: content = [{"type": "text", "text": "这里有一个有趣的事实。"}]
  • Output - "这里有一个有趣的事实。" (内容中没有图片,保持不变。)

    • 输入为包含图片URL的列表: content = [
  • {"type" - "text", "text": "这张酷酷的照片里的天气是什么:"},

  • {"type" - "image_url", "image_url": {"url": "http://example.com/photo.jpg"}} ]

  • Output - "这张酷炫照片中的天气是什么: http://example.com/photo.jpg> 如果你看不到,这张图片的标题是: 山脉上美丽的日落 " (图片后添加的标题)