Skip to main content

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方法:如果代理是多模态代理,它还将使用图像标签。 a. 连接process_last_received_message方法(注意:这是视觉能力连接的地方) b. 连接process_all_messages_before_reply方法
  3. send方法: a. 连接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 - 如果提供,将使用提供的可调用对象来为图像生成字幕。这允许在标准LMM服务交互之外进行自定义字幕逻辑。可调用对象应该接受三个参数作为输入:
    1. 图像URL(或本地位置)
    2. 图像数据(PIL图像)
    3. lmm_client(用于调用远程LMM) 然后返回一个描述(字符串形式)。 如果未提供,字幕将依赖于通过lmm_config配置的LMM客户端。 如果提供了custom_caption_func,我们将不会运行默认的self._get_image_caption方法。

抛出

  • AssertionError - 如果未提供有效的lmm_configcustom_caption_func,则会引发AssertionError,以指示视觉能力需要其中之一有效才能运行。

process_last_received_message

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

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

该函数旨在将内容转换为与GPT-4V多模态输入兼容的格式,具体而言,通过将字符串格式化为PIL兼容的图像(如果需要),并为图像附加文本描述。这样可以在无法直接显示图像的情况下更方便地呈现内容。

参数

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

返回值

  • str - 增强后的消息内容

抛出异常

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

示例

假设self._get_image_caption(img_data)返回图像的"一张美丽的山脉日落"。

  • 字符串输入: content = "看看这张酷照片!"

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

  • 字符串输入,带有图像位置: content = "这张酷照片的天气如何:<img http://example.com/photo.jpg>"

  • 输出 - "这张酷照片的天气如何:<img http://example.com/photo.jpg> 如果你看不到,这张图片的标题是:一张美丽的山脉日落"(图像后添加了标题。)

  • 列表输入,仅包含文本: content = [{"type": "text", "text": "这是一个有趣的事实。"}]

  • 输出 - "这是一个有趣的事实。"(内容中没有图像,保持不变。)

  • 列表输入,包含图像URL: content = [

  • {"type" - "text", "text": "这张酷照片的天气如何:"},

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

  • 输出 - "这张酷照片的天气如何:<img http://example.com/photo.jpg> 如果你看不到,这张图片的标题是:一张美丽的山脉日落"(图像后添加了标题。)