
奥本 AI 将所有的最新 AI 聚合到了一起,为您开启多模型 AI 绘画新时代!
扫码即刻关注公众号
如何将图像创建者代理添加到多代理应用程序中
6 个月前
如何将图像创建代理添加到多代理应用程序中
快速教程:使用GPT-4o和Dalle-3代理构建可视化自动生成应用程序
作者的图片 如果你曾经对人工智能代理能做的事情感到惊讶,你可能会想知道它们是如何工作的。构建一个人工智能代理,甚至是一群人工智能代理,将显著提升你的大型语言模型(LLM)应用,从将一个大任务分解成更小的任务并逻辑地规划每一步,到利用强大的人工智能专业知识。这些包括检索增强生成(RAG)、代码解释和执行、函数调用、结构化数据输出,以及利用不同的工具和API。借助今天先进的框架,如AutoGen和CrewAI,加上提示策略,可以设置一群人工智能代理来自动解决复杂问题,前所未有地提升商业和生活效率。 我们现在看到像Stable Diffusion和Midjourney这样的AI图像生成器正在创造惊人的艺术作品。OpenAI的Dalle-3,是Dalle-2的巨大升级版,集成到了ChatGPT和OpenAI API包中。这使它成为目前最令人兴奋的AI艺术模型之一。鉴于Dalle-3的能力,将我们的代理与这个强大的模型连接起来,对于看看我们的AI应用程序是否能够解决艺术作品创作任务至关重要。 为什么需要一个Dalle-3代理?
Dalle-3代理在您的自动化任务工作流程中有多种实际用途。 例如,当你需要创建营销文案时,通常需要像数据研究员、文案撰写者、评论家和输出包装器这样的代理,以将最终的输出文本适配到像HTML或Word这样的结构化文件中。营销材料还应该有相关的插图来使其更具吸引力和专业性,这是Dalle-3代理的责任,它遵循代理的讲话来捕捉文本内容,将关键思想转换为提示文本,并生成图像到输出包中。 这是这样一个群聊工作流程的图表:
此外,文案撰写人、提示代理和Dalle-3代理可以根据用户指示多次迭代子任务,以确保每个段落都可以由相关图片支持。这是与独立的ChatGPT游乐场相比,自定义图片代理的高级用法。 这个演示的设计
为了专注于在多智能体应用中实现图像代理,我将向您展示一个在AutoGen框架中的简单演示开发,其中包括一个提示代理和一个Dalle-3代理。这两个代理在任何艺术作品生成任务中都扮演着关键角色,它们共同工作以创建和迭代用户所需的图像。 像往常一样,我将选择一个易于使用的UI框架来处理可视化;在这个演示中,将使用Panel。 这里是截图:
- 我请求为“YeyuLab”设计一个硅谷风格的徽标。
第一版生成 2. 它看起来像一个化学实验室,所以我请求一个与人工智能相关的标识,并寻求进一步的指导。
第二版 3. 看起来好多了,但我仍然觉得元素太多,显得有些杂乱。
最终版本 现在,尽管字符缺失(这仍然是正常的),但标志看起来不错,我甚至没有自己制作任何精细的提示。 实现并不复杂,所以让我们快速看一下Python代码。 代码演示
- 安装依赖项
确保你已经安装了必要的包,包括AutoGen、OpenAI和Panel:
pip install --upgrade pyautogen==0.2.32 openai==1.36.1 panel==1.4.4
- 包含这些库、类和函数
对于使用OpenAI的自动生成: ``` import autogen from autogen import AssistantAgent, ConversableAgent, UserProxyAgent
import openai from openai import OpenAI
```
对于面板:
import panel as pn
from panel.chat import ChatMessage
杂项:
import os
import time
import asyncio
- 设置面板的聊天用户界面
假设你已经学会了如何使用Panel的创新UI框架来开发应用程序。那么,你会发现设置聊天UI布局以包装人类用户和LLM助手之间的对话是多么容易。
从草图开始设计聊天界面架构。
这样的几行代码可以用来实现上面的布局。 ``` pn.extension(design="material")
chat_interface = pn.chat.ChatInterface(callback=callback) chat_interface.send("Send a message!", user="System", respond=False)
pn.template.MaterialTemplate( title="Multi-agent with image generation", header_background="black", main=[chat_interface], ).servable() ```
这里的关键是创建一个 chat_interface
对象,它使得所有的聊天小部件都可以被应用程序代码访问和控制。在这个地方,我们向接口注册了一个 callback
,每当聊天输入小部件中的 chat_interface
添加输入内容时,这个 callback
就会被触发。
让我们看看回调函数。
4. 回调处理器
为了适应AutoGen的架构,用户文本输入触发的回调处理器有两种路径, a) 开始一个群聊任务 b) 给代理的进一步指示 ``` initiate_chat_task_created = False input_future = None
async def callback(contents: str, user: str, instance: pn.chat.ChatInterface):
global initiate_chat_task_created
global input_future
if not initiate_chat_task_created:
asyncio.create_task(delayed_initiate_chat(user_proxy, manager, contents))
else:
if input_future and not input_future.done():
input_future.set_result(contents)
else:
print("There is currently no input being awaited.")
```
全局变量 initiate_chat_task_created = false
将创建一个 asyncio
任务来运行 delayed_initiate_chat()
函数中 AutoGen 的核心进程,通过提供代理和内容。input_future
变量用于存储和信号后续输入。
这是简单的 delayed_initiate_chat()
函数:
```
async def delayed_initiate_chat(agent, recipient, message):
global initiate_chat_task_created
# Indicate that the task has been created
initiate_chat_task_created = True
# Wait for 2 seconds
await asyncio.sleep(2)
# Now initiate the chat
await agent.a_initiate_chat(recipient, message=message)
```
它只是在短暂等待后简单地调用了AutoGen方法a_initiate_chat()
。
5. 代理创建 — 用户_代理
好的,现在我们正在转向这个应用最关键部分——构建代理。
需要构建三个代理:user_proxy
,作为人类管理员的行为代理;prompt_assistant
,为Dalle-3生成编写高质量提示的代理;以及dalle_agent
,负责生成图像的代理。
这是用户代理:
user_proxy = MyConversableAgent(
name="Admin",
system_message="A human admin.",
code_execution_config=False,
human_input_mode="ALWAYS",
)
作为一个非人工智能代理,用户代理的角色是请求并传递用户输入到AutoGen的核心进程并打印它。为了将这些输入与Panel UI集成,我们应该定义一个自定义类MyConversableAgent
,以重写原始ConversableAgent
中的输入处理器a_get_human_input
。
```
class MyConversableAgent(autogen.ConversableAgent):
async def a_get_human_input(self, prompt: str) -> str:
global input_future
chat_interface.send(prompt, user="System", respond=False)
# Create a new Future object for this input operation if none exists
if input_future is None or input_future.done():
input_future = asyncio.Future()
# Wait for the callback to set a result on the future
await input_future
input_value = input_future.result()
input_future = None
print("input_value: ", input_value)
return input_value
```
在新的 a_get_human_input
函数中,我们向面板用户界面打印系统提示,以通知用户输入,然后等待消息对象 input_future
,它将由我们之前 callback
函数中的面板用户界面文本输入设置。
6. 代理创建 — 提示_助手
下一个代理应该具备生成用于图像创作的合适提示文本的能力,因此我们将为此代理使用GPT-4o。 ``` gpt4_config = {"config_list": [{'model': 'gpt-4o',}]}
prompt_assistant = AssistantAgent( name="Prompt_Assistant", human_input_mode="NEVER", llm_config=gpt4_config, system_message='''You are a prompt engineer for image generation tasks using the DALL-E model. Your goal is to generate creative and accurate image prompts for the model based on user input.
**Your Responsibilities:**
1. **Analyze User Input:** Carefully read the user's message and identify their desired image
2. **Understand User Preferences:** Determine the user's preferred style, tone, and overall aesthetic (e.g., realistic, cartoon, abstract, whimsical).
3. **Generate Image Prompts:** Craft one or more detailed image generation prompts based on the user's message and preferences.
- **Clarity is Key:** Make sure your prompts are clear, specific, and easy for the DALL-E model to interpret.
- **Include Details:** Provide information about subject, setting, action, style, and composition.
- **Use Descriptive Language:** Choose words and phrases that evoke the desired visual style and imagery.
Please make sure your response only contains prompt sentences, without including any description or introduction of this prompt.
''',
) ```
除了系统消息之外,创建这样一个AssistantAgent
并没有什么特别的。然而,我们应该做额外的工作,将代理的输出重定向到面板用户界面。
```
def print_messages(recipient, messages, sender, config):
print(f"print - Messages from: {sender.name} sent to: {recipient.name} | num messages: {len(messages)} | message: {messages[-1]}")
content = messages[-1]['content']
if all(key in messages[-1] for key in ['name']):
chat_interface.send(content, user=messages[-1]['name'], respond=False)
else:
chat_interface.send(content, user=recipient.name, respond=False)
return False, None # required to ensure the agent communication flow continues
prompt_assistant.register_reply( [autogen.Agent, None], reply_func=print_messages, config={"callback": None}, ) ```
这里我们定义了一个print_message
函数,用来调用chat_interface.send()
方法,将内容及其相关发送者发送到前端。然后,将这个函数注册到代理prompt_assistant
的回复函数上,这意味着每当代理从协调器接收到消息时,print_message()
将被触发。
7. 代理创建 — Dalle_代理
最后但同样重要的是,是时候创建Dalle代理来创建图像了。由于AutoGen中的代理类没有与Dalle模型集成,我们必须自定义一个。
首先,我们来创建一个普通的ConversableAgent
,给它一个名字和一个自动回复消息,以表明图像已生成(在Dalle-3模型中,这个图像将有一个临时的URL)。
dalle_agent = ConversableAgent(
name="Dalle_Agent",
default_auto_reply= f"Image URL generated",
)
其次,我们为这个代理注册了一个 generate_image()
函数作为回复函数。现在,每当从 Prompt_Assistant
代理接收到提示消息时,就可以运行创建图像的过程,比如调用 Dalle-3 模型 API。我们将 dalle3_config
作为配置参数输入到函数中,以备后续使用。
```
dalle3_config = {"config_list": [{"model": "dall-e-3"}]}
dalle_agent.register_reply( [autogen.Agent, None], reply_func=generate_image, config={"llm_config": dalle3_config}, ) ```
继续前进,看看 generate_image()
函数中做了什么。
```
def generate_image(recipient, messages, sender, config):
print(f"image - Messages from: {sender.name} sent to: {recipient.name} | num messages: {len(messages)} | message: {messages[-1]}")
prompt = messages[-1]["content"]
if all(key in messages[-1] for key in ['name']):
chat_interface.send(prompt, user=messages[-1]['name'], respond=False)
else:
chat_interface.send(prompt, user=recipient.name, respond=False)
client=OpenAI()
response = client.images.generate(
model=config['llm_config']['config_list'][0]['model'],
prompt=prompt,
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
print("image_url:", image_url)
jpg_pane = pn.pane.Image(image_url, width=400)
content = ChatMessage(jpg_pane, user=dalle_agent.name)
chat_interface.send(content)
return False, {"content": content}
```
这里有三个步骤:
1. 打印由 prompt_assistant
代理提供的提示信息。
2. 使用OpenAI API通过Dalle-3模式生成图像。响应将是一个图像文件的URL。
3. 在面板中创建一个图像消息对象,并将其显示给前端。
8. 经理创建
根据AutoGen的群聊结构定义,我们必须创建一个管理代理来协调群中的所有三个代理。只需创建一个包含这些代理的群聊,然后使用GPT-4o模型创建管理代理。
groupchat = autogen.GroupChat(agents=[user_proxy, prompt_assistant, dalle_agent], messages=[], max_round=20)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=gpt4_config)
运行和测试
我们已经成功创建了 user_proxy
和 manager
,这足以在之前的调用 asyncio.create_task(delayed_initiate_chat(user_proxy, manager, contents))
中初始化一个群聊,是时候结束并运行代码了。
这是一个基于面板的Python代码,所以我们应该运行Panel命令(假设代码文件是autogen_panel_image.py
):
panel serve autogen_panel_image.py
如果您看到这个输出,您的应用程序已经上线。内部网络的URL是 `
http://localhost:5006/autogen_panel_image`使用默认端口5006,如果您拥有公共IP地址,它也可以从外部访问。
这个演示只是展示了在构建图像生成代理方面的冰山一角。现在轮到你发挥创造力,构建更加令人惊叹和复杂的应用程序了! 感谢阅读。如果你认为这篇文章有帮助,请为这篇文章鼓掌👏。你的鼓励和评论对我来说意义重大,无论是精神上还是经济上。🍔 在你离开之前: ✍️ 如果您有任何问题,请给我留言或找到我
和
您可以在开发和部署方面得到我的积极支持。 ☕️ 如果您想要拥有独家资源和技术服务,请订阅我的服务上的 **
** 将是一个不错的选择。 💯 我也愿意接受任何创新和全栈开发工作。
赋迪奥本AI
上海赋迪网络科技
电话:18116340052