跳到主要内容

3 篇博文 含有标签「AI」

AI

查看所有标签

智能体(AI Agent):企业该如何实践

· 阅读需 37 分钟

1. 概述

AI Agent 可以翻译为人工智能代理或智能体,下文为了概念一致,统一将 AI Agent 描述为智能体。

提示

Open AI 、Google、Microsoft 还有国内如阿里、百度等一些厂商对智能体定义及智能体各部分组成结构等都有各自的解释,各厂商的概念整体上是相同的,个别地方有细微差别。下文结合 Open AI 和 Google 的定义作说明。

信息

2. 什么是智能体

AI 智能体的核心是大语言模型 (LLM),因此,AI 智能体通常也称为大语言模型智能体。它是能够代表用户独立完成任务的系统(或应用程序),可执行一系列步骤以实现用户目标。它利用大语言模型来管理工作流程的执行并做出决策。它能够识别工作流程何时完成,并且在必要时可以主动纠正自身行为。失败时,它可以暂停执行并将控制权交回给用户。它可以使用各种工具与外部系统进行交互,既可以收集上下文信息,也可以采取行动。并且,它会根据工作流的当前状态动态选择合适的工具,并在明确界定的安全策略保护范围内运行。

例如,组织可能会构建一个费用管理智能体来帮助员工管理费用报销。费用管理智能体可以使用大语言模型与公司支出政策文档相结合来回答员工关于可以报销哪些费用以及有哪些限制的问题。此外,费用管理智能体还可以使用编程函数根据报销金额自动提交定期重复费用(例如每月手机账单),或根据报销金额智能地将费用流转到适当的审批者。

上图显示了以下过程:

  1. 员工向费用管理智能体询问可以报销的费用问题。

  2. 费用管理智能体接受问题并将其作为大语言模型的提示(Prompt)。

  3. 费用管理智能体检索包含公司一系列费用政策等信息的知识库作为提示的依据。

  4. 有依据的提示将提交到费用管理智能体的大语言模型,以生成响应,会在响应中提供相关的政策文档链接。

  5. 费用管理智能体代表用户生成费用单据,并将其提交以进行处理。

在更复杂的情境中,组织可以开发多智能体解决方案,其中多个智能体协调它们之间的协作。 例如,旅行预订智能体可以为员工预订航班和酒店,并自动向费用管理智能体提交带发票的费用单据,如下图所示:

alt text

此图显示了以下过程:

  1. 用户向旅行预订智能体提供即将旅行的详细信息。

  2. 旅行预订智能体自动预订机票和预订酒店。

  3. 旅行预订智能体通过费用智能体为差旅费用发起费用报销。

  4. 费用智能体提交费用报销进行处理。

3. 企业何时需要构建智能体解决方案

一些确定性的解决方案,即传统的工作流引擎或规则引擎就像一个检查表,根据预设条件进行决策。当企业考虑是否需要构建智能体解决方案时,首先要考虑传统的确定性的解决方案是否可以满足,当不能很好的满足需求时,再考虑智能体解决方案。

智能体的核心是大语言模型,大语言模型智能体的工作方式更像一位经验丰富的调查员,评估上下文背景情况,利用推理能力能够有效处理复杂、模糊情况。如涉及以下几项需求,则考虑构建智能体解决方案,

  • 复杂决策:涉及微妙判断、特殊情况或上下文敏感决策的工作流,例如客户服务工作流中的退款审批。

  • 规则难以维护:由于规则集广泛且复杂,导致系统难以管理,更新成本高或容易出错,例如对供应商的一些评估审查。

  • 严重依赖非结构化数据:涉及解读自然语言、从文档中提取含义或与用户进行对话交互的场景,例如处理家庭保险理赔。

4. 智能体的组成

为了理解智能体的内部运作机制,我们可以把驱动智能体行为、行动和决策的基本组成部分描述为一种认知架构,智能体的认知架构中有三个基本组成部分。

  1. 模型

不同的模型在任务复杂性、延迟和成本方面各有优势和权衡。可能需要考虑在工作流程中针对不同任务使用多种模型。并非每个任务都需要最智能的模型,简单的检索或意图分类任务或许可以由更小、更快的模型处理,而像决定是否批准退款这样更棘手的任务,可能会得益于能力更强的模型。

一种行之有效的方法是,为每个任务使用最强大的模型来构建智能体原型,以建立性能基线。从这开始,尝试换用较小的模型,看看它们是否仍能取得可接受的结果。这样,你就不会过早限制智能体的能力,并且可以分析较小的模型在解决特定业务场景时,哪些方面具有优势和劣势。

总之,选择模型的原则很简单:

  • 设置评估以建立性能基线
  • 专注于使用现有的最佳模型来达到你的准确率目标
  • 在可能的情况下,用较小的模型替换较大的模型,以优化成本和响应延迟。
  1. 工具

虽然语言模型在处理信息方面表现出色,但它们缺乏直接感知和影响现实世界的能力。这限制了它们在需要与外部系统或数据进行交互的场景中的应用价值。语言模型的优劣取决于它从训练数据中学到的内容。但无论我们向模型输入多少数据,它们仍然缺乏与外部世界交互的基本能力。

工具是在我们的基础模型与外部世界之间建立联系的桥梁,它使智能体能够与外部数据和服务进行交互。这种与外部系统和数据的联系,使得我们的智能体能够执行更多种类的任务。工具可以是外部函数或应用程序接口,它可以有多种形式,复杂程度也各不相同,但通常与常见的网络 API 方法(如GET、POST、PATCH和DELETE)一致。

工具能够帮助智能体完成多种任务,例如调整智能家居设置、更新日历、按照预设指令发送电子邮件等。此外,智能体还可以利用工具在数据库中更新客户信息,或获取实时天气数据来优化旅行建议。通过工具,智能体得以访问和处理现实世界的信息,这使其能够支持更专业的系统(如检索增强生成 RAG),从而显著扩展基础模型本身的能力。

  1. 编排层

编排层描述了一个循环往复的过程,用于管理智能体如何:

  • 获取信息‌,
  • 进行内部推理‌,
  • 并运用该推理结果来指导其后续行动或决策。

通常,这个循环会持续进行,直到智能体达成目标或到达某个终止节点。编排层的复杂程度差异巨大,具体取决于智能体及其正在执行的任务。有些循环可能只是基于决策规则的简单计算;而另一些循环则可能包含链式逻辑、涉及额外的机器学习算法,或是实现了其他概率推理技术。

5. 智能体如何工作

想象一下,在一个繁忙的厨房里有一位厨师。他的目标是为餐厅顾客制作美味的菜肴,这涉及到一些规划、执行和调整的循环。

  • 他们收集信息,比如顾客的订单以及食品储藏室和冰箱里有哪些食材。

  • 根据刚刚收集到的信息,对可以制作哪些菜肴和风味进行一些内部推理。

  • 采取行动制作菜肴:切菜、调配香料、煎炒。

在这个过程的每个阶段,厨师会根据需要进行调整,随着食材的消耗或收到顾客反馈来完善他们的计划,并利用之前的一系列结果来确定下一个行动计划。这种信息收集、规划、执行和调整的循环,描述了厨师为实现目标所采用的一种独特的认知架构。

就像厨师一样,智能体可以使用认知架构,通过迭代处理信息、做出明智决策,并根据先前的输出优化后续行动,来实现其最终目标。智能体认知架构的核心是编排层,它负责维护记忆、状态、推理和规划。它利用迅速发展的提示工程领域及相关框架来指导推理和规划,使智能体能够更有效地与环境互动并完成任务。针对语言模型的提示工程框架和任务规划领域的研究正在迅速发展,产生了各种有前景的方法。以下是一些最流行的框架和推理技术:

  • ReAct 是一种提示工程框架,它为语言模型提供了一种思维过程策略,使模型能够针对用户查询进行推理并采取行动,无论是否有上下文示例。ReAct 提示已被证明优于多个当前最优(SOTA)基准,并提高了大语言模型(LLMs)与人类的互操作性和可信度。

  • 思维链(Chain-of-Thought,CoT)是一种提示工程框架,它通过中间步骤实现推理能力。思维链有多种子技术,包括自一致性、主动提示和多模态思维链,每种技术根据具体应用都有其优缺点。

  • 思维树(Tree-of-thoughts,ToT)是一种提示工程框架,非常适合探索或前瞻性战略任务。它对思维链提示进行了概括,使模型能够探索各种思维链,这些思维链可作为使用语言模型解决一般问题的中间步骤。

智能体可以利用上述推理技术中的一种,或许多其他技术,为给定的用户请求选择下一个最佳行动。

6. 提升智能体应用的模型能力

企业智能体应用应考虑模型的性能,现实世界的场景往往需要训练数据之外的知识。可以将此想象为基本烹饪技能与精通特定菜系之间的区别。两者都需要烹饪基础知识,但后者需要有针对性的学习,以获得更优秀的成果。

为了帮助模型获取这类特定知识,有几种方法:

  • 上下文学习: 这种方法在推理时为通用模型提供提示、工具和少量示例,使其能够 “即时” 学习如何以及何时针对特定任务使用这些工具。ReAct 框架就是自然语言领域中这种方法的一个示例。

  • 基于检索的上下文学习: 该技术通过从外部存储中检索最相关的信息、工具及相关示例,动态地将其填充到模型提示中。例如,前面提到的基于 RAG 架构的数据存储。

  • 基于微调的学习: 这种方法包括在推理之前使用更大的特定示例数据集对模型进行训练。这有助于模型在收到任何用户查询之前了解何时以及如何应用某些工具。

为了对每种学习方法提供更多了解,让我们回顾一下之前的烹饪类比。

  • 想象一下,一位厨师从顾客那里收到了一份具体的食谱(提示)、几种关键食材(相关工具)以及一些菜品示例(少样本示例)。基于这些有限的信息以及厨师的烹饪常识,他们需要“即兴”想出如何烹制出最符合食谱和顾客喜好的菜肴。这就是上下文学习

  • 现在,让我们想象一下,我们的厨师身处一个储备丰富的厨房,其中有一个满是各种食材和食谱(示例和工具)的食品储藏室(外部数据存储)。此时,厨师能够从食品储藏室中动态选择食材和食谱,从而更好地匹配顾客的菜谱和喜好。这使得厨师能够利用现有知识和新知识,做出更有见地、更精致的菜肴。这就是基于检索的上下文学习

  • 最后,假设我们送厨师回学校学习一种新菜系或一组菜系(在更大的特定示例数据集上进行预训练)。这能让厨师在面对未来从未见过的顾客菜谱时,有更深入的理解。如果我们希望厨师在特定菜系(知识领域)上出类拔萃,这种方法堪称完美。这就是基于微调的学习

这些方法中的每一种在速度、成本和延迟方面都有独特的优点和缺点。然而,通过在智能体框架中结合这些技术,我们可以利用它们的各种优势并将劣势降至最低,从而实现一个更强大、更具适应性的解决方案。

7. 智能体类型

智能体编排可以分为:单智能体系统(Single-agent systems)多智能体系统(Multi-agent systems)

  • 单智能体系统(Single-agent systems),即单个模型配备适当的工具和指令,以循环方式执行工作流程。单个智能体可以通过逐步添加工具来处理多项任务,每一个新工具都能扩展其能力。

一般建议是首先最大化单个智能体的能力。更多的智能体可以直观地对概念进行区分,但也会带来额外的复杂性和开销,因此通常一个配备工具的智能体就足够了。

  • 多智能体系统(Multi-agent systems),即工作流执行分布在多个相互协作的智能体之间。

对于许多复杂的工作流程而言,将提示和工具分散到多个智能体中,有助于提升性能和可扩展性。当智能体无法遵循复杂指令,或持续选择错误工具时,可能需要进一步拆分系统,引入更多不同的智能体。

例如:

  • 复杂逻辑: 当提示词包含大量条件语句(多个 “如果 - 那么 - 否则” 分支 ),且提示模板难以扩展时,可考虑将每个逻辑部分分配给不同智能体。

  • 工具过载: 问题不仅在于工具数量,还在于工具的相似性或重叠性。有些实现能成功管理 15 个以上定义清晰、互不相同的工具,而有些在处理少于 10 个功能重叠的工具时就会遇到困难。如果通过提供描述性名称、清晰参数和详细说明来提高工具清晰度仍无法提升性能,可使用多个智能体。

虽然多智能体系统可以根据特定的工作流程和需求以多种方式进行设计,通常有以下两种编排形式:

  1. 管理器模式或集中管理模式(Manager pattern)(智能体作为工具):一个中央 “管理器” 智能体通过工具调用协调多个专业智能体,每个专业智能体处理特定的任务或领域。

在集中管理模式中,一个中央单元智能体包含全部知识库、连接各个智能体并监督它们的信息。这种结构的优点在于智能体之间易于通信、知识统一。中心化的缺点是依赖中央单元智能体;如果中心单元失效,整个智能体系统也会失效。

  1. 分散式或去中心化模式(Decentralized pattern)(智能体之间任务移交):多个智能体对等运行,根据各自的专业领域相互移交任务。

在上述示例中,初始用户消息被发送到分类智能体。分类智能体识别到输入内容与最近的一次购买有关,便会调用转交给订单管理智能体,并将控制权转移给它。智能体之间可以相互“移交”工作流执行权。它允许一个智能体将任务委托给另一个智能体。同时转移最新的对话状态。 这种模式涉及在平等的基础上使用多个智能体,其中一个智能体可以直接将工作流程的控制权交给另一个智能体。当你不需要单个智能体维持集中控制时,这种模式是最优的,允许每个智能体根据需要接管执行并与用户进行交互。

这种模式在诸如对话分类等场景中特别有效,或者在任何你希望专业智能体完全接管某些任务,而无需原始智能体继续参与的情况下也同样有效。另外,你可以为第二个智能体配备一个交回控制权给原始智能体的功能,以便在必要时再次转移控制权。

分散式智能体与其邻近的智能体共享信息,优点包括稳健性和模块化。由于没有中央单元,当一个智能体失效时,并不会导致整个系统失效。

无论采用何种模式,同样的原则都适用:保持灵活性、可组合性,并由清晰、结构良好的提示(Prompt)驱动。

8. 企业智能体应用示例场景

想象一下,您是一个生产线的维护技术人员,收到了警报信息:其中一台机器停止工作。通常,这些警报以代码的形式出现,例如 IHT 或 PDE 。如果您是一位经验丰富的技术人员,您知道这意味着测量的参数已超出可接受的范围。但是,究竟是哪个参数出了问题呢?具体范围是什么?

如果检查机器时没有发现明显的问题,您就必须仔细阅读数百页的维修手册和文档来诊断问题。通过企业创建的维修顾问智能体应用可以在几秒钟内从企业的手册、过去的维修和文档中检索所有这些信息,并用简单易懂的语言回答您的问题。技术人员可以询问:这台机器以前出现过故障吗?解决方法是什么?维修顾问智能体应用将会检索答案,还可以根据这个工厂中的这台机器的文档和历史记录,为技术人员推荐维修方案。这就是企业应用智能体的优势 — 他们可以从经验中学习,就像人类一样。

维修顾问智能体应用不仅仅是一个知识库。这个智能体可以在相关业务流程的情境中主动工作,并了解 ERP 系统中的数据。它不仅会根据手册和维修历史记录来推荐机器修理方案,还掌握了具体机器的详细信息,可以在 SCM 系统中检查需要更换的零件是否仍在保修期内。这意味着智能体可以推荐更理想的维修解决方案,并帮助您获得替换零件的保修信息,从而节省时间并降低成本。智能体不仅仅是为您提供答案,而是能够结合企业数据、政策和流程,在帮助您做出更智能、更高效的行动的同时提供答案。

9. 如何开发智能体

智能体仍处于早期阶段。随着 AI 背后科技的发展,其底层框架也将不断发展。以下是一些目前流行的 AI 智能体框架。

LangChain

LangChain 是一个开源的用于开发由大语言模型提供支持的应用程序框架。它采用模块化架构,每个模块都封装了使用 LLM 所需的复杂概念和步骤的抽象结构。可以将这些模块化组件串联起来,创建智能体应用程序。LangChain 几乎可以作为所有大语言模型的通用接口。它为向量数据库提供支持,将存储合并到应用程序中,从而保留历史记录和上下文。其 LangSmith 平台组件允许进行调试、测试和性能监控。

LangChain 由 Harrison Chase 于 2022 年 10 月推出,之后迅速脱颖而出,LangChain 是 Github 上增长最快的开源 AI 项目。

LangGraph

LangGraph 是 LangChain 生态系统中的一个平台组件。该框架擅长为多智能体系统编排复杂的工作流。

例如,航空公司可能希望构建一个旅行助手 AI 智能体,以便帮助用户查找和预订航班。使用 LangGraph,每个操作都将表示为节点,并且这些节点可以有多个执行特定任务的智能体。

LlamaIndex

LlamaIndex 是一个领先的框架,它利用大语言模型和工作流程来构建基于LLM的数据智能体。该框架提供 Python 和 TypeScript 两种版本,通过组合各种工具和功能,简化了生成式AI用例的上下文增强流程(RAG)。

CrewAI

CrewAI 是开源的多智能体 AI 解决方案的编排框架。CrewAI 支持与各种大语言模型的连接,该框架还拥有一套检索增强生成 (RAG) 工具来搜索不同的数据源。

AutoGen

AutoGen (github) 是 Microsoft 推出的开源框架,用于创建多智能体 AI 应用程序来执行复杂任务。

AutoGen 还提供了两种方便的开发人员工具:用于评估智能体型 AI 性能和执行基准测试的 AutoGen Bench,以及用于开发智能体的无代码界面的 AutoGen Studio。

Semantic Kernel

Semantic Kernel (github )是 Microsoft 提供的一个轻量级的开源开发工具包,可让您轻松构建人工智能代理,并将最新的人工智能模型集成到您的 C#、Python 或 Java 代码库中。它是一个高效的中间件,能够快速交付企业级解决方案。

Dify

Dify 是一个开源的大语言模型应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 应用。Dify 可以为开发人员节省大量时间,使他们能够专注于业务需求,快速构建生产级的生成式 AI 应用。Dify 这个名字来自 Define + Modify,指的是定义并不断改进我们的 AI 应用程序。

10. 选择智能体开发框架时需考虑的因素

在深入智能体领域之前,请先考虑一下您所在组织的目标和任务场景。理想的框架可在您的技术能力、短期需求和长期目标之间取得平衡。

以下是选择智能体框架时需要考虑的几个方面:

  • 复杂性

确定您希望智能体完成的任务以及这些任务的复杂程度。确定您是需要仅包含单个智能体的简单实施,还是需要多智能体生态系统。对于多智能体环境,规划出所需的智能体交互以及仍然需要人工干预的地方。

例如,在客户支持领域,单个智能体即可帮助对所遇问题的严重程度进行分类。但是,如果您想要高效率的工作流,请考虑创建一个具有不同功能智能体的多智能体系统,以便解决问题、提出修复建议并将复杂的案例分配给其他智能体。

  • 数据隐私和安全

选择智能体框架时,数据隐私和安全必须是首要考虑因素。验证您选择的框架的安全策略和措施,包括静态和传输中数据的加密、访问控制和删除任何敏感信息。

  • 使用便捷

考虑开发团队的技能水平。例如,Dify、CrewAI 等适合初学者的 AI 框架具有用于快速原型设计的无代码界面和用于快速部署的现成的 AI 智能体模板。更有经验的 AI 开发人员可能会使用高级智能体框架,例如 LangGraph,它提供低级别控制和可定制的代码选项。

  • 无缝集成

根据智能体框架与现有技术栈的兼容性来对其进行评估。检查您选择的框架与当前数据源、基础设施和工具的集成程度。了解如何将智能体部署到您的环境中(无论是本地还是云)以及是需要小规模还是大规模的部署。

  • 性能和可扩展性

评估所选智能体框架的性能。考虑实时应用程序的响应时间或延迟,并评估在处理大量数据或多个并发请求时性能是否会下降。虽然重点可能放在短期上,但也要考虑框架如何随着业务的增长而扩展。

11.企业开发智能体应用的实施步骤

开发智能体的实施步骤与其他任何 AI 部署相似。首先,您需要定义任务:您希望智能体做些什么,并尽可能具体地列出目标和目的。然后,确定智能体在工作中需要遵循的功能流程、需要访问的数据、可以访问的工具和其它智能体。

建议企业先从小范围的测试开始,密切监视使用情况和结果,并根据结果优化智能体,然后在成功的基础上提高智能体的自主性。

举个例子,某零售商需要开发一个需求预测智能体,帮助其为学生的开学季做好规划。

  1. 定义业务目标: 该智能体的任务是预测产品需求,包括背包、笔记本和儿童服装。

  2. 确定所需数据: 整理数据源,至少需要相关产品的历史销售数据;有关当前市场趋势和经济指标的信息;以及客户人口统计和购买历史。企业可以纳入可能影响需求的季节性趋势数据,例如气温可能高于正常水平,以及成功促销、折扣和营销活动的历史详情,这可能有助于提高准确性。

  3. 外部工具: 将智能体与库存管理、ERP及供应链计划等系统集成,可显著提升业务处理的准确性和效率。此外,建议联合相关产品线的业务专家,通过其经验建议指导智能体开发中的工具选型与决策制定。

  4. 提供反馈: 定期评估和调优是一项前期投资,但事实证明这些投资往往都是值得的。企业可以收集客户和专家反馈,确定需要改进的地方。

  5. 配置足够的资源: 最后一点,需要有足够的计算资源来运行智能体。

12. 参考资料

[1] OpenAI 白皮书《A Practical Guide To Building Agents》 下载 PDF
[2] Google 白皮书《Agents》 下载 PDF
[3] Google 白皮书《Agents Companion》 下载 PDF
[4] LangChain
[5] LangGraph
[6] LlamaIndex
[7] CrewAI
[8] AutoGen
[9] AutoGen Github
[10] Semantic Kernel
[11] Semantic Kernel Github
[12] Dify 官网
[13] Dify Github

开源免费的生成式人工智能(Generative AI)课程

· 阅读需 6 分钟

1. 概述

生成式人工智能(Generative AI)无疑是目前最为火爆的计算机领域前沿技术。下面列出一些免费开放课程,适用于人工智能领域的初学者或想提高相关技能的专业人士。

提示

下面课程的链接,有些是需要外网特殊访问,如没有网络环境可以看国内哔哩哔哩等视频网站平台上的其他人的搬运。

2. 微软、谷歌、亚马逊等公司的开源免费生成式 AI 课程

2.1 面向初学者的生成式人工智能课程(微软)

微软的开源免费课程项目目前有 21 节,面向生成式人工智能初学者,每节课都有一个主题,可以从任意主题开始。课程分为学习(Learn)课程和构建(Build)课程。学习课程解释概念,构建课程除了解释概念外还包括用 Python 和 TypeScript 实现的代码示例(支持 Azure OpenAI 和 OpenAI API )。

课程链接:Generative AI for Beginners (Version 3)

2.2 面向初学者的 AI 代理 (微软)

本课程有11节课,涵盖了构建AI代理的基础知识。每节课都涵盖了自己的主题。

课程链接:AI Agents for Beginners

2.3 生成式人工智能学习路径(谷歌)

此学习路线概要介绍了生成式 AI 的概念,包括大语言模型的基础知识和负责任人工智能(Responsible AI) 原则等。一共五个视频。

课程链接:Google Cloud Skills Boost

2.4 适用于所有人的生成式 AI(Deeplearning.AI )

由人工智能先驱吴恩达(Andrew Ng)讲授的 Generative AI for Everyone 以他独特的视角,为你和你的工作提供人工智能生成技术。将引导你了解生成式人工智能的工作原理以及它能做什么(不能做什么)。你将深入了解生成式人工智能的功能、潜力和局限。你将深入了解现实世界中的应用并学习常见的使用案例。你将亲身参与生成式人工智能项目,将所学知识付诸行动,深入了解其对商业和社会的影响。

本课程旨在确保每个人都能成为人工智能推动的未来的参与者。

课程链接:适用于所有人的生成式 AI

2.5 采用大型语言模型的生成式人工智能(亚马逊)

这是一门中级课程,因此你应该有一定的 Python 编程经验,这样才能学有所获。你还应该熟悉机器学习的基础知识,如监督和非监督学习、损失函数以及将数据分成训练集、验证集和测试集。如果你已经学习了 DeepLearning.AI 的机器学习专业课程或深度学习专业课程,那么你就可以学习本课程,深入学习生成式人工智能的基础知识。

通过学习本课程,将学会

  • 深入理解生成式人工智能,描述基于 LLM 的典型生成式人工智能生命周期中的关键步骤,从数据收集和模型选择到性能评估和部署
  • 详细描述为 LLM 提供动力的转换器架构、如何训练 LLM 以及如何微调 LLM 以适应各种特定用例
  • 使用经验缩放法则,在数据集大小、计算预算和推理要求之间优化模型的目标函数
  • 应用最先进的训练、调整、推理、工具和方法
  • 使用最先进的训练、调整、推理和工具、听完行业研究人员和从业人员的故事后,讨论生成式人工智能为企业带来的挑战和机遇
  • 对 LLM 如何工作以及训练和部署 LLM 背后的最佳实践有了良好基础了解的开发人员,将能够为他们的公司做出正确的决策,并更快地构建工作原型。

课程链接: Generative AI with Large Language Models

2.6 Introduction to Generative AI 2024 Spring(李宏毅公开课 台湾大学)

课程链接:Introduction to Generative AI 2024 Spring

用 Dify 构建一个简单的大语言模型(LLM)驱动的应用程序

· 阅读需 11 分钟

1. 概述

Dify 是一个开源的大语言模型(LLM)应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 应用。

Dify 可以为开发人员节省大量时间,使他们能够专注于业务需求,快速构建生产级的生成式 AI 应用。

Dify 这个名字来自 Define + Modify,指的是定义并不断改进我们的 AI 应用程序。

本文旨在初步探索了解 Dify 可以做到哪些事情,以及什么样的业务需求可以由 Dify 来帮助我们去完成。

2. 假设的一个业务场景

北京市公共数据开放平台 是一个面向公众的政府数据平台。这些数据(见下图)与我们生产生活密切相关,它们是以文件或接口形式对外开放。信息种类和数量庞杂,要想了解某一类信息,需要通过接口获得数据,再对数据进行加工处理。

open-data

例如:北京市统计局提供的农林牧渔业总产值,见下图

excel-data

可以利用 Dify 创建 AI 交互应用,自动获得我们要的数据,并利用 LLM 来帮助我们理解分析数据。

3. 最终实现的功能

创建一个 ChatFlow 应用,当启动时,可以有两个查询选项。(见下面视频演示)

分别是:

  • 北京市农林牧渔业总产值-表格
  • 北京市农林牧渔业总产值-柱状图

在这个例子中 LLM 的作用是将 API 接口调用获得的数据进行抽取,因为接口返回的数据集中既包括北京市的总体数据也包括了各个区的数据。

我们的业务需求是:

  • 当查询 北京市农林牧渔业总产值-表格 时,只要北京市的历年农林牧渔业的总产值和分项产值,各个区的历年数据是不需要的。
  • 当查询 北京市农林牧渔业总产值-柱状图 时,只要北京市的历年农林牧渔业的总产值,各个区的总产值和各分项产值是不需要的。

北京市农林牧渔业总产值 Excel 文件。Download

当查询 北京市农林牧渔业总产值-表格 时,结果如下图。

app-done1

当查询 北京市农林牧渔业总产值-柱状图 时,结果如下图。

app-done2

4. 准备 Dify 测试环境

测试环境为华为云服务器 Ubuntu 22.04 server 64bit(2核 4G内存)配置安全组入规则,允许 80 端口。安装 Docker 和 Docker Compose(v2)

从项目库下载社区 Release 版 https://github.com/langgenius/dify 解压上传到 Ubuntu 服务器上

# 进入 Dify 源代码的 Docker 目录
cd dify/docker

# 复制环境配置文件
cp .env.example .env

# 启动 Docker 容器
docker compose up -d

第一次访问 http://服务器IP地址 需要设置管理员邮箱和密码。

5. 准备后端数据服务接口

为了简单和方便测试,这里没有使用北京市公共数据开放平台,而是使用了一个模拟的后端接口。

使用了一个开源的项目 JSON-Server,并将 json-server 在 docker 环境中运行。

首先,创建一个 Dockerfile 文件,并拷贝下面内容。

FROM node:latest

RUN npm install -g json-server

WORKDIR /data
VOLUME /data

EXPOSE 80
ADD run.sh /run.sh
ENTRYPOINT ["bash", "/run.sh"]
CMD []

创建一个 run.sh 文件,并拷贝下面内容。

#!/bin/bash

args="$@"

args="$@ -p 80"

file=/data/db.json
if [ -f $file ]; then
echo "Found db.json, trying to open"
args="$args db.json"
fi

file=/data/file.js
if [ -f $file ]; then
echo "Found file.js seed file, trying to open"
args="$args file.js"
fi

json-server $args

这个 db.json 文件包含我们的测试数据 Download

在 Ubuntu 服务器的 home 目录下创建 docker-json-server 目录,将三个文件 Dockerfile , run.sh , db.config 上传到这个目录下,如下图所示。

json-server

进入到这个目录下执行下面命令,构建 json-server 的 docker 镜像。


docker build -t docker-json-server .

执行下面命令,启动 json-server docker 运行时,这里使用 8081 端口。需要打开云服务器的安全组规则,允许 8081 的访问。

docker run -d --name docker-json-server -p 8081:80 -v /home/docker-json-server/db.json:/data/db.json --restart=always docker-json-server 

打开浏览器访问 http://服务器IP:8081/data 可以看到数据,表示我们后端服务模拟的数据接口可以使用了。

json-server-api

6. 在 Dify 中接入 DeepSeek

这里使用 DeepSeek 作为模型供应商接入 Dify ,需要申请 API key,打开 DeepSeek API 开放平台,创建 API Key

如下图所示:

deepseek-apikey

进入 Dify 界面,点击设置,如下图

setting

在模型供应商中搜索并安装深度求索,设置刚才创建的 API key,如下图所示。

install-apikey

DeepSeek 模型使用价格,参见 价格详情

如果选择本地自建模型,可以选择 Ollama 。它是开源工具,专为无缝部署大语言模型(LLM)而设计。

可参考在 Dify 接入 Ollama 部署的本地模型

7. 在 Dify 中创建应用

打开 http://服务器IP 登录到 Dify 后,在主页中,点击创建空白应用。选择 Chatflow ,输入应用名称 北京市数据开放平台查询

create-app

下图是创建完成的所有流程节点。

app-done

下面依次介绍各个节点。

首先,要设置两个开场问题选项,如下图所示。

start

条件分支节点

ifelse

两个 API 请求节点,两个节点调用 API 地址一样。

api-call

条件分支下的回复节点

other-else

LLM 节点,将调用 API 获得的数据抽取出北京市的各项产值,并要求表格输出。

LLM

LLM 后面的回复节点。

LLM-ansower

参数提取器节点,将调用 API 获得的数据抽取出北京市的历年农林牧渔业总产值,构造用于画柱形图的数据。

params

代码节点,用于生成柱形图

code

完整 javascript 代码段如下:

function main({xData,yData}) {

let option = {
title: {
text: '农林牧渔业总产值(万元)',
left: 'center',
textStyle: {
color: '#1890ff',
fontSize: 14
}
},
xAxis: {
type: 'category',
data: xData.split(',').map(Number)
},
yAxis: {
type: 'value'
},
series: [
{
data: yData.split(',').map(Number),
type: 'bar',
smooth: false
}
]
};

let output = "```echarts\n" + JSON.stringify(option) + "\n```"

return {
result:output
}

}

代码节点后的回复节点

code-ansower

8. 测试应用

当查询 北京市农林牧渔业总产值-表格 时,只显示北京市的历年农林牧渔业的总产值和分项产值,各个区的历年数据不在输出结果中。

app-done1

  • 当查询 北京市农林牧渔业总产值-柱状图 时,只显示北京市的历年农林牧渔业的总产值柱状图,各个区的总产值和各分项产值不体现在柱状图中。

app-done2

9. 其它

本文仅简单演示了 Dify 的一些基础功能,Dify 还有一些其它的能力。

  • 工作流中的代码节点仅适用于逻辑简单的情况。如果要实现更复杂的业务可以开发自定义的插件。
  • 通过创建自定义的工作流并转换成工具组件,也可以实现处理流程逻辑的复用。
  • 通过创建基于业务的知识库,可以结合信息检索和大语言模型(LLM)的生成能力,即 RAG (Retrieval-Augmented Generation 检索增强生成)能力。建立一个业务知识库适用于智能客服(基于企业文档问答)和医疗/法律问答(基于专业知识数据库)等场景应用。

10. 参考资料

[1] Dify 官网
[2] Dify Github
[3] 北京市公共数据开放平台
[4] 北京市公共数据开放平台-农林牧渔业总产值
[5] JSON-Server
[6] DeepSeek API 开放平台
[7] DeepSeek 价格详情
[9] Ollama
[10] 接入 Ollama 部署的本地模型