2023 年 AI 新突破导出不穷,隔两个月就会有一个爆点出来,AI 迎来了一个新的里程碑时刻。从 OpenAI 推出的 ChatGPT 到 Midjourney 发布的 V5/V6 版本,AI 在各个领域都取得了突破性的进展。随着 AI 技术的日益成熟,我们也开始思考如何更好地利用 AI 工具来提高工作效率。
到 2024 年, AI 应用、AI 配套的框架和工具如雨后春笋。
在这个 AI 大时代,有两种「编程范式」值得我们关注。为什么要打上引号呢?
因为这里所说的编程,已经不再局限于传统意义上的写代码,而是泛指利用各种工具和模型,将它们灵活组合,创造出新的应用和价值。
第一种范式是基于 ComfyUI 的编程。ComfyUI 是一个模块化的 AI 图像生成工具,它允许用户通过拖拽和连接不同的节点,轻松创建出令人惊艳的 AI 艺术作品。在 ComfyUI 上编程,你无需掌握复杂的代码知识,只需要理解每个模块的功能,并将它们以合理的方式组合在一起,就能得到理想的结果。这种直观、易用的特点,使得 ComfyUI 成为了平面设计、插画创作等领域的得力助手。
第二种范式则是基于 LangChain 的编程。与 ComfyUI 注重视觉创作不同,LangChain 的重点在于自然语言处理。通过 LangChain,开发者可以将语言模型与外部数据源相结合,快速构建功能丰富的聊天机器人、智能文档助手等应用。LangChain 提供了一系列现成的模块和接口,使得即使是非 NLP 专业的程序员,也能在短时间内上手并应用到实际项目中。从客户服务到数据分析,LangChain 正在各行各业发挥着重要作用。
相比传统的编程范式,AI 编程更加注重模块化和灵活组合。我们无需从零开始构建一个完整的系统,而是站在巨人的肩膀上,将现有的模型和工具进行拼装和优化。这种方式不仅大大降低了开发门槛,也极大地提高了开发效率。当然,AI 编程范式也并非完美无缺。对于一些需要高度定制化的场景,传统的代码编程仍然不可或缺。此外,AI 工具的使用也对开发者提出了更高的要求,需要我们对各种模型和算法有更全面的理解和把控。
接下来,简单聊一聊这两种「编程范式」,
comfyUI
ComfyUI 是一个基于 Stable Diffusion 的开源 AI 绘图工具,采用了模块化的节点式工作流设计。它通过将 Stable Diffusion 的各个组件和处理步骤抽象为独立的节点,使得用户可以通过直观的拖拽、连接操作来构建复杂的图像生成流程。
ComfyUI 解决了传统 AI 绘图工具易用性差、扩展性低的问题。其模块化设计和直观的 Web 界面大大降低了用户的使用门槛,无需深入了解底层技术细节,即可快速构建和调整工作流。同时,ComfyUI 还提供了强大的自定义节点机制,允许开发者轻松扩展新的功能和模型,使其能够适应不断发展的AI绘图领域。
ComfyUI 最初由开发者 Comfyanonymous 在 2022 年末发起,旨在提供一个简单、直观的 Stable Diffusion Web UI。早期版本实现了基本的节点类型和 Web 界面,展示了其模块化设计的优势,吸引了一批 AI 绘图爱好者的关注。
在 2023 年春夏,ComfyUI 进入了快速发展阶段。项目不断增加新的节点类型,如 ControlNet、Inpaint、Upscale等,支持更多的图像控制和后处理功能。同时,ComfyUI 引入了自定义节点机制,大大扩展了其功能和适用范围。项目也集成了更多 Stable Diffusion 衍生模型,为用户提供了更多选择。
随着用户社区的不断壮大,ComfyUI 的生态也日益丰富。社区成员积极贡献工作流、节点脚本、训练模型等资源,推动项目的发展。ComfyUI 举办了一系列社区活动,促进了用户间的交流和创作。项目代码库也迎来了更多贡献者,社区力量成为 ComfyUI 发展的重要推动力。
2023 年冬至今,ComfyUI 开始着眼于生态融合和应用拓展。项目与其他 AI 绘图工具建立了联系,支持工作流的导入导出和 API 集成。ComfyUI 也开始探索更多应用场景,如虚拟主播、游戏 mod 等,拓宽了 AI绘图的应用范围。越来越多的开发者和公司开始关注和使用 ComfyUI,其发展前景备受看好。未来,ComfyUI 将继续完善节点系统,引入更先进的 AI 技术,并加强生态建设,有望成为 AI 绘图领域的重要基础设施。
ComfyUI 中节点之间的关联是通过连接节点的输入和输出端口来实现的。每个节点都有预定义的输入和输出端口,用户可以在 UI 界面上将一个节点的输出端口连接到另一个节点的输入端口,从而建立节点之间的数据流和执行顺序。
在 ComfyUI 的后端实现中,这种节点关联是通过一个有向无环图来表示的。DAG 是一种常用的数据结构,用于描述一组节点之间的依赖关系和执行顺序。
当用户在 UI 界面上连接两个节点时,实际上是在 DAG 中添加一条边,表示数据从源节点流向目标节点。ComfyUI 会根据 DAG 的拓扑结构,确定节点的执行顺序,并在运行时将数据在节点之间传递。
ComfyUI 中节点关联有一些关键实现细节:
-
端口类型匹配:每个节点的输入和输出端口都有预定义的数据类型。在连接节点时,只有类型匹配的端口才能建立连接。
-
数据传递:当一个节点执行完毕后,它会将结果数据发送到所有连接到其输出端口的节点的输入端口。
-
执行调度:ComfyUI 会根据 DAG 的拓扑顺序,确定节点的执行顺序。当一个节点的所有输入数据都准备好时,该节点就可以开始执行。
-
并行执行:无依赖关系的节点可以并行执行,提高执行效率。ComfyUI 会自动分析 DAG,找出可以并行执行的节点。
-
缓存优化:对于某些计算量大的节点,ComfyUI 会缓存其计算结果,避免重复计算。当节点的输入数据没有变化时,就可以直接使用缓存的结果。
ComfyUI 通过将节点组织成 DAG 的方式,实现了节点之间的关联和数据流控制。这种设计使得用户能够以可视化的方式创建复杂的图像处理工作流,同时也为并行优化和缓存优化提供了便利。
comfyUI 中核心工作都是围绕其节点,其主要节点如下。
-
Text Prompt(文本提示)节点:提供文本描述,指导图像生成,输入是用户输入的文本提示如”1girl, brown hair, smile”;输出是编码后的文本向量(tokens)。几乎所有的绘图工作流都需要文本提示节点,它是指定图像内容的主要方式。
-
Latent Image(潜在图像)节点:表示潜在空间中的图像,可以是随机初始化的噪音,也可以来自其他节点的输出。输入是噪音参数(如seed、尺寸等),或其他节点传递的潜在图像。输出是潜在空间中的图像表示。作为采样起点(初始噪音)或中间结果(如图像修补、图生图等)。
-
Sampler(采样器)节点:根据条件迭代优化潜在图像,使其解码后符合要求。输入是潜在图像、文本向量、其他条件(如 ControlNet 输出等)、采样步数、采样方法等参数。输出是优化后的潜在图像。采样是图像生成的核心,不同的采样器节点可以权衡生成质量和多样性。
-
ControlNet 节点:根据附加条件(如边缘、姿态、深度等)控制生成图像。输入是潜在图像、条件图(如 Canny 边缘图)、ControlNet 模型参数等。输出是融合条件控制的潜在图像。用于生成满足特定结构、布局或属性要求的图像,如人像、动漫线稿上色等。
-
VAE Encode(VAE编码)节点:将 RGB 图像编码为潜在空间表示。输入是 RGB 图像,如用户上传的图片。输出是潜在空间中的图像表示。用于图生图、图像修补、图像融合等需要以图像为起点的任务。
-
VAE Decode(VAE解码)节点:将潜在空间表示解码为 RGB 图像。输入是潜在空间中的图像表示,通常来自采样器节点。输出是 RGB 图像。用于生成最终可见的图像结果。
-
Upscale(放大)节点:增加图像分辨率,提高细节。输入是 RGB 图像,放大方法和倍数等参数。输出是放大后的 RGB 图像。用于生成高分辨率图像,常在VAE解码后使用。
-
Inpaint(图像修补)节点:根据 mask 和提示,对图像的指定区域进行编辑。输入是原始图像、mask 图像、修改区域的文本提示等。输出是修改后的图像。用于对生成图像进行局部编辑,如去除伪影、修改细节等。
除了以上常用节点,comfyUI 还有许多其他节点,如图像保存、剪裁、格式转换等,用于图像的后处理和输出。不同节点可以灵活组合,构建多种多样的绘图工作流,满足各类需求。
举个例子,一个常见的工作流是:文本提示节点 -> 潜在图像节点(初始噪音) -> ControlNet节点(添加结构条件) -> 采样器节点(优化潜在图像) -> VAE解码节点(生成RGB图像) -> 放大节点(提高分辨率) -> 图像保存节点(输出最终结果)。
如下图所示:
+-------------------+ +------------------+ +------------------+
| | | | | |
| Load Model Node |---->| Text Encode Node|---->| Latent Image Node |
| | | | | |
+-------------------+ +------------------+ +-------------------+
|
|
v
+-------------------+
| |
| ControlNet Node |
| |
+-------------------+
|
|
v
+------------------+ +------------------+ +------------------+
| | | | | |
| Upscale Node |<----| VAE Decode Node |<----| Sampler Node |
| | | | | |
+------------------+ +------------------+ +------------------+
|
|
v
+------------------+
| |
| Output Image |
| |
+------------------+
通过对节点的连接配置和参数调整,用户可以精细控制每个步骤,实现理想的 AI 绘图效果。同时,comfyUI 也鼓励用户开发和分享自定义节点,不断扩展其功能和应用领域。
在理解 ComfyUI 的原理时,其核心还是理解 SD 的原理,简单来讲是通过大模型、CLIP 和 VAE 编码器以及采样器的协同工作,将文本提示转换为特征马赛克,再通过 VAE 解码器还原成图像,从而实现基于文本描述生成图像的功能。
LangChain
什么是 LangChain?
LangChain 是一个开源的 Python 框架,旨在帮助开发者更容易地构建基于大语言模型(LLM)的应用。它提供了一系列工具和组件,可以方便地与各种 LLM 模型集成,如OpenAI GPT、Anthropic Claude、Google PaLM等,而无需从头开始构建或进行大量的微调。
LangChain 旨在简化和统一语言模型与外部数据和应用程序的集成过程。它为开发者提供了一套灵活的工具和组件,可以轻松地将 OpenAI、Hugging Face 等流行的语言模型与知识库、API 等数据源相结合,从而快速构建功能强大的自然语言处理应用,如聊天机器人、智能文档助手、问答系统等。
LangChain 解决了语言模型应用开发中的诸多痛点。在 LangChain 出现之前,开发者需要编写大量的胶水代码来处理不同模型和数据源之间的交互,这不仅耗时耗力,也容易引入错误。LangChain 通过提供一致的接口和预构建的组件,大大简化了这一过程。它还引入了 Prompt Engineering 的理念,允许开发者通过设计优化的提示模板来引导模型生成更准确、更符合需求的输出。
LangChain 的发展历程可以追溯到 2021 年底。最初,它只是一个简单的概念验证项目,旨在探索如何将语言模型与外部数据集成。随着 ChatGPT 等大语言模型的出现和 NLP 技术的快速发展,LangChain 的潜力开始受到关注。
2022 年,LangChain 迎来了重大更新和扩展。它引入了更多的集成选项,支持了更多种类的数据源和下游应用。同时,LangChain 的社区也在不断壮大,越来越多的开发者开始贡献代码和分享经验。
2023 年,伴随着 AI 的大爆发,LangChain 迎来了爆发式增长。它成为了开发 AI 应用的必备工具之一,在各大技术论坛和社交平台上频频被提及。LangChain 也加速了版本迭代和功能更新,引入了更多高级特性,如 Agent 和 Memory,进一步增强了其适用性和性能。
如今,LangChain 已经发展成为一个成熟而强大的 NLP 应用开发框架。它不仅帮助开发者大幅提高了开发效率,也为各行各业带来了前所未有的智能化应用。展望未来,LangChain 还将持续演进,与最新的 AI 模型和技术保持同步,为开发者和用户带来更多惊喜。
LangChain 的核心是将 LLM 与外部数据源连接,并通过 prompt engineering 技术来优化 LLM 的输入输出,从而生成更加准确、相关的结果。它的主要组件和功能如下:
-
模型输入输出(Model I/O):对接各种 LLM 模型的 API,提供统一的接口。支持 OpenAI、Anthropic、Hugging Face 等主流 LLM 服务商。
-
语言模型(Language Models):支持大型语言模型(LLM)和聊天模型(ChatModel)的交互接口。
-
提示模板(Prompt Templates):用于生成模型输入的预定义配方,支持两种主要类型是:PromptTemplate:生成字符串提示 和 ChatPromptTemplate:生成聊天消息列表提示。
-
示例选择器(Example Selectors):提供训练、调优、测试和控制模型行为的示例输入输出。
-
输出解析器(Output Parsers):用于将模型返回的文本结果格式化为目标对象、JSON 或数组等。
-
数据连接(Data Connection):在许多 LLM 应用程序中,用户特定的数据不在模型的训练集中,这可能是通过检索增强生成(RAG)实现的。RAG 的主要方法是检索外部数据,并在生成步骤中传递给 LLM。这样,LLM 就可以使用外部数据来增强生成的结果,从而提高应用程序的性能和准确性。
-
文档加载器(Document Loaders):将不同数据源的非结构化文本加载为文档对象,并支持延迟加载。
-
文档转换器(Document Transformers):对加载的文档进行处理,包括文本拆分、冗余过滤、元数据提取等。
-
文本嵌入模型(Text Embedding Models):将文本转换为向量表示,用于文本检索、信息推荐、知识挖掘等。
-
矢量存储(Vector Stores):负责存储嵌入数据并执行矢量搜索。
-
检索器(Retrievers):从大规模文本库中检索与查询相关的文本段落,提供问答系统的额外上下文支持。
-
链(Chains):组件化的方式将一系列操作连接在一起形成数据处理的工作流,如数据检索、内容生成、翻译等可复用的任务执行流程。常见的链包括 LLMChain、SequentialChain、RouterChain 等。
-
基础链(LLMChain):围绕语言模型的简单链。由提示模板和语言模型组成,用于格式化提示并返回 LLM 输出。
-
路由链(RouterChain):可以动态选择下一条链,包括 LLMRouterChain 和 EmbeddingRouterChain。
-
顺序链(SequentialChain):将多个链顺序连接,支持 SimpleSequentialChain 和更通用的 SequentialChain。
-
转换链(TransformChain):在链之间添加自定义转换函数。
-
文档链(DocumentsChain):处理多个文档输入。
-
记忆(Memory):为 Chains 和 Agents 提供对话状态记忆能力,用于在链之间存储和传递信息,实现上下文感知。常见的包括 ConversationBufferMemory、ChatMessageHistory 等。
-
代理(Agents):一种特殊的 Chain,可根据目标进行工具选择、动作规划和迭代求精。使用 LLM 作为大脑自动思考和决策,执行动作完成任务。包括 ZeroShotAgent、ReAct、Self Ask With Search 等。
-
回调(Callbacks):连接到 LLM 申请的各个阶段,用于日志记录、监控等。
LangChain 主要解决了以下问题:
-
-
-
-
-
使文本嵌入和检索更加方便,支持向量空间中的各种运算。
-
通过链的概念,允许将多个组件组合成复杂的工作流程。
-
-
那如何使用呢?
使用 LangChain 的一般步骤可能包括:
-
-
使用文档加载器加载数据,并利用文档转换器进行预处理。
-
-
-
-
-
在使用过程中有一些注意的事项:
-
根据任务选择合适的 LLM:不同的 LLM 适用不同任务,并有不同的使用成本,需要根据实际情况权衡。在使用 LangChain 前,需要明确了解自己的需求和应用场景,选择和配置合适的组件和模型。
-
注意提示工程:LLM 的效果很大程度取决于提示的设计,需要遵循最佳实践,多进行实验和迭代。
-
数据的隐私和安全:在涉及用户数据时,注意数据的安全性和隐私保护,遵循相关法律法规和最佳实践。特别是在 fine-tuning 或者数据索引时,要注意数据的隐私和版权问题。
-
模型的公平性和伦理性:LLM 可能会放大数据中的偏见,产生有害或者不道德的内容,需要谨慎使用。
-
应用的可解释性:端到端的 LLM pipeline 往往是个黑盒,要考虑如何向用户解释其工作原理和局限性。
-
成本和效率优化:要密切关注 LLM 调用次数、向量检索等环节的耗时和费用,权衡精度和成本。对于大规模数据处理或高吞吐量的应用,需关注性能优化,可能需要并行处理、缓存机制、硬件加速等手段。
通过合理的使用和配置,LangChain 可以极大地简化复杂 AI 应用的开发流程,提高开发效率和应用性能。LangChain 的设计使得开发者可以灵活地构建和定制 AI 应用程序,以适应不同的业务需求。
LangChain 适用于构建各种 LLM 驱动的应用,比如智能对话助手、知识库问答、数据分析、文案创作等。LangChain 正在成为 LLM 应用开发领域的生产力工具,促进更多创新产品和服务的诞生。
小结
AI 编程范式正在为我们开启一个全新的创作空间。ComfyUI 让设计变得前所未有的简单,LangChain 则让智能对话唾手可得。站在时代的十字路口,拥抱 AI,学习新的编程范式,我们就能更从容地迎接未来的挑战与机遇。
但,纸上得来终觉浅,绝知此事要躬行。
在实际的工作中,这些要用起来,才能有更深刻的体会。
以上。