背景

随着GenAI的流行,利用Stable Diffusion等方式通过使用文本描述的方式生成图片的方式在很大程度上降低了图片创作的门槛,并在包括创意图生成、营销图生成等多个领域投入了实际生产之中,提升了生产力。与此同时,这一类的生图工具又带来了一系列的新的学习门槛,尤其是在提示词工程上,为了写出好的提示词,需要用户进行系统的学习不同模型适合的提示词,并且不断的尝试。而且,仅支持英语的提示词也对非英语国家用户造成了一定的困难。本文通过亚马逊云科技Amazon Bedrock支持的大语言模型以及Stable Diffusion模型,配合Langchain Agent实现了交互式文生图功能,用户可以要求Langchain Agent根据其指令反复调整提示词并生成图片以达到无需提示词工程且较为精细化控制图片生成的效果。

Amazon Bedrock

Amazon Bedrock是一项完全托管的服务,使用单个API提供来自AI21 Labs、Anthropic、Cohere、Meta、Stability AI和Amazon等领先人工智能公司的高性能基础模型(FM),以及构建生成式人工智能应用程序所需的一系列广泛功能,在维护隐私和安全的同时简化开发。借助Amazon Bedrock的全面功能,可以轻松尝试各种热门FM,使用微调和检索增强生成(RAG)等技术利用您的数据对其进行私人定制,并创建可执行复杂业务任务(从预订旅行和处理保险索赔到制作广告活动和管理库存)的托管代理,所有这些都无需编写任何代码。由于Amazon Bedrock是无服务器的,因此无需管理任何基础设施,并且可以使用已经熟悉的亚马逊云科技服务将生成式人工智能功能安全地集成和部署到您的应用程序中。

Langchain

LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序具备以下功能:

具备上下文感知:将语言模型与上下文来源(提示指令、少量示例、内容以支持其响应等)连接在一起。

具备推理能力:依赖语言模型进行推理(根据提供的上下文来确定如何回答问题,采取什么行动等)。

Chain

单独使用语言模型(LLM)对于简单的应用程序来说是可以的,但更复杂的应用程序需要将LLMs进行串联——要么相互串联,要么与其他组件串联。

LangChain提供了两个高级框架用于“chaining”组件。传统方法是使用Chain接口;更新的方法是使用LangChain表达式语言(LCEL)。在构建新应用程序时,建议使用LCEL进行链式组合。但也支持许多有用的内置Chain,因此在这里记录了这两种框架。

Agents

代理(agents)的核心理念是使用语言模型(LLM)来选择要执行的一系列操作。在链条(chains)中,一系列操作是硬编码的(在代码中)。而在代理中,语言模型被用作推理引擎,以确定要执行哪些操作以及以何种顺序执行这些操作,这其中又包含两个重要组件:Agent和Tool。

Agent:Agent负责决定Chain接下来要采取的步骤,它由一个语言模型和一个提示来驱动,不同的代理具有不同的推理方式、不同的输入编码方式以及不同的输出解析方式,本文中使用的Agent类型为ReAct Agent,是一种将推理和行动与LLMs结合的通用范式。“ReAct”通过Prompt的设计,为大语言模型制定了一个任务生成的口头推理和执行行动的过程。这使得大语言模型应用在执行动态推理的同时,能够创建、维护和调整行动计划,并与外部环境进行交互,将附加信息纳入推理过程。

Tool:Tool为Agent提供了调用的功能,帮助Agent访问不同的数据集,LangChain提供了一组广泛的工具供您开始使用,同时还可以轻松定义自己的工具。

Memory

大多数语言模型应用都具有会话式界面。会话的一个重要组成部分是能够引用先前在对话中提到的信息。最基本的情况下,一个会话系统应该能够直接访问一定范围内的先前消息。更复杂的系统需要具备一个不断更新的世界模型,使其能够维护关于实体及其关系的信息等等。我们将这种存储关于过去互动的信息的能力称为“Memory”。LangChain提供了许多实用工具,用于为系统添加Memory。这些实用工具可以单独使用,也可以无缝地集成到Chain中。

实现

架构

本文中测试脚本适用于Mac环境,Windows/Linux环境需要做相应的适配,其中Langchain和Bedrock交互架构图如下所示:

准备工作

IAM用户

需要调用Bedrock的模型同时将交互过程中产生的图片放置到S3中,所以需要预先给IAM User这方面的权限。

同时需要在Bedrock中配置可以使用的Model。

ANACONDA安装

环境配置

创建两个文件。在命令行中执行。

在Jupyter Lab中创建一个Notebook。首先我们引入需要的依赖项并且初始化Bedrock和S3的客户端。

然后我们创建用来生成提示词的工具generate_prompt_api,在这个工具内部,使用LLMChain来引导大语言模型生成提示词。这里选用了Anthropic的Claude模型。generate_prompt_api函数的注释描述了工具的用途和输入输出,这些信息会被Langchain Agent捕获到,用来指导这一工具的使用时机和方式。这里还调整了LLMChain的提示词模板prompt_template,使它更符合Claude模型的要求。对于返回值,也做了裁剪,只留下生成的提示词部分。

另外需要定义用来文生图的工具text_to_image_api。使用了Stable Diffusion XL模型。由于Bedrock在调用Stable Diffusion时会返回base64编码的图片,需要解码后进行展示,同时,也把图片存到S3上,并且生成了临时的URL方便共享使用。

最后,把以上工具、记忆功能(memory)组装到Langchain Agent中,此处Langchain Agent也使用Anthropic的Claude模型作为它的“大脑”。

实验

英文Prompt测试

1. 首先先让Agent生成一个好的提示词

2. 这个提示词还不错,画个图试试

3. 要求重新生成更好一点的prompt

4. 希望换个赛博朋克风格

5. 上面生成的图片中,没有足球了,要求必须有足球

6. 要求调整一下猫的颜色为黑色

通过实验可以发现,上述Agent可以比较好的识别指令,并根据上下文调整提示词并生成图片。但是随着对话轮次变多以及上下文变长,它有可能会遗忘一些关键信息,需要通过命令进行一些再次提示。

中文Prompt测试

1. 首先先测试通过中文输入生成英文的Prompt,从下面的结果来看还不错

2. 继续调整需求,将图片中的水牛换成河马,让其Prompt换成“提示词中把水牛改成河马,其他不变”,从结果来看其中水牛已成功换成了河马

3. 继续增加需求,修改图片的风格,油画风格更甚

4. 增加一些印象派元素

5. 增加一些莫奈风格

至此,通过基于英文和中文的Prompt分别测试了交互式的生成prompt,继而生成图片的场景,从结果来看还是可以的。当然,限于目前大语言模型的能力,多步推理的成功率并不太高,因此暂时还是让每个工具直接返回结果,相信随着模型能力的不断提升,这一流程能进一步简化。

总结

亚马逊云科技Amazon Bedrock作为一项完全托管的服务,用户只需要通过API的调用就可以完成基于LLM的推理工作,大大地降低了用户涉足AI的门槛,同时Serverless的方式也极大的降低了入门成本。本文通过基于对Bedrock API的调用,结合Langchain框架的调度,实现了一套多语言的交互式的文生图场景,可以让用户基于上下文的调整对于图片的需求,最终生成自己想要的图片。

原标题:使用Amazon Bedrock和Langchain Agent实现交互式文生图

原链接:https://aws.amazon.com/cn/blogs/china/interactive-text-to-picture-generation-with-amazon-bedrock-and-langchain-agent/

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。

推荐内容