掌握高效大模型任务流搭建术(二):链式流程如何赋能 AI 处理能力提升

前言:

在上一篇文章中,我们初步探索了 LangChain 的基础链式操作——LLMChain。它巧妙地将大语言模型(LLM)与提示模板(Prompt Template)相结合,为模型交互逻辑的封装提供了一种简洁而高效的方式。

然而,LangChain 的强大之处远不止于此。在 LLMChain 的基础上,LangChain 还提供了众多实用的 Chain 工具,其中 Sequential Chain 尤为引人注目。Sequential Chain 可以被视为一种高级的工作流工具,它专为那些需要多步骤连续处理的大语言模型任务量身定制。

在现实的工作场景中,我们常常会遇到这样的情况:任务的完成并非仅仅依靠简单的问答就能达成,而是需要经过一系列复杂的逻辑推理和信息处理步骤。Sequential Chain 正是为解决这一难题而生。它能够将这些分散的步骤有序地串联起来,使得每一步的输出无缝地成为下一步的输入,从而实现整个任务的连贯处理。无论是对复杂问题进行逐步拆解、逐层提取关键信息,还是进行多阶段的推理分析,Sequential Chain 都能大显身手,极大地提高工作效率,为完成多步骤任务提供坚实有力的支撑。

在 LangChain 的 Sequential Chain 设计中,主要存在两种类型:

     SimpleSequentialChain :它适用于单一输入和输出的场景,每个链仅处理一个输入,并基于此生成一个输出。
     SequentialChain:这种类型能够处理多个输入和多个输出,从而可以胜任更复杂的任务逻辑和数据流情况。

借助这两种链类型,LangChain 有能力灵活地应对从简单到复杂的多步骤任务,为开发者构建基于大语言模型的工作流提供高效的工具支持。

1:Simple Sequential Chain

Simple Sequential Chain 是 LangChain 中一种较为基础的链式结构,主要用于将多个链依次串联起来。其工作流程是,第一个链接收输入,经过处理后生成输出,这个输出随即作为第二个链的输入,以此类推,直至最后一个链生成最终的结果。

从图中可以看出,整个流程是线性和连续的,非常适合处理单一输入和单一输出的简单任务场景。通过这种方式,任务被分解为多个独立的步骤,易于管理和调试,同时保持逻辑的清晰性和处理的高效性。

接下来我们尝试调用这个链-还是要先导入必要的库

import os

from langchain_community.chat_models.tongyi import ChatTongyi

from langchain.chains import LLMChain

from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate

from langchain.memory import ConversationBufferMemory

from langchain.chains import SimpleSequentialChain

# 设置 API 密钥

os.environ["DASHSCOPE_API_KEY"] = 'sk-63f00f6776fd4f64beb06ed5edf197eb'

# 初始化通义千问模型

llm = ChatTongyi()

# 第一个提示模板,用于生成公司名称

first_prompt = ChatPromptTemplate.from_template(

    "用一句话描述一个制作 {product} 的公司最合适的名称是什么?"

)

# 链 1:根据产品生成公司名称

chain_one = LLMChain(llm=llm, prompt=first_prompt)

# 第二个提示模板,用于生成公司描述

second_prompt = ChatPromptTemplate.from_template(

    "为以下公司写一段 20 个词的描述:{company_name}"

)

# 链 2:根据公司名称生成公司描述

chain_two = LLMChain(llm=llm, prompt=second_prompt)

# 第三个提示模板,用于生成广告语

third_prompt = ChatPromptTemplate.from_template(

    "根据以下公司描述生成一句创意广告语:{company_description}"

)

# 链 3:根据公司描述生成广告语

chain_three = LLMChain(llm=llm, prompt=third_prompt)

# 构建包含三个链的 SimpleSequentialChain

overall_simple_chain = SimpleSequentialChain(

    chains=[chain_one, chain_two, chain_three],  # 将新链加入到链的顺序中

    verbose=True# 输出详细日志

)

# 输入产品信息,运行整个链

prodcut = '裤子'

print(overall_simple_chain.run(product))

从这里我们可以看出,利用这个SimpleSequentialChain链可以轻松构建出完整的工作流程。以总结一篇论文为例,我们的目标并不是简单地让大模型直接总结整篇文章,而是将任务拆解成更细的步骤:先让模型分别总结第一段、第二段和第三段的内容,然后再对这些部分的总结进行汇总。通过这种将复杂问题逐步拆解的方式,可以显著提升模型的回复质量和能力,确保结果更加精准和全面。

2:   Sequential Chain

     SequentialChain 是 LangChain 中一种功能强大的链式结构,相较于 SimpleSequentialChain,它提供了更高的灵活性和复杂性。SequentialChain 允许多个链并行处理不同的输入,并且能够将多个输出进行合并或分别传递到后续的链中。从流程设计的角度来看,SimpleSequentialChain 只支持单一的线性顺序,而 SequentialChain 则支持更复杂的流程设计,可以满足更广泛的业务需求。这种设计使得 SequentialChain 在处理复杂的多步骤任务时更加高效和灵活,能够更好地适应各种复杂的场景和任务需求。

具体来说,SequentialChain 比 SimpleSequentialChain 的优势在于:

  输入灵活性 :SequentialChain 支持用户同时传递多个输入,这些输入可以分别进入不同的链条。例如,用户可以将不同的数据集或参数分别传递给 Chain 1 和 Chain 3。
  输出管理 :每个链的输出不仅可以作为下一个链的输入,还可以分发到多个后续链。例如,Chain 2 和 Chain 3 的输出都可以传递给 Chain 4。
  多路合并:最后的链(如 Chain 4)可以整合来自多个链条的结果,生成最终输出。这种设计使得 SequentialChain 在处理复杂的多步骤任务时更加灵活和强大,能够更好地适应各种复杂的场景和任务需求。

假如我们希望按着图片上的模式来进行定制Sequential Chain的话,第一步其实还是要先把SequentialChain导入

以下是一个完整示例:

import os

from langchain_community.chat_models.tongyi import ChatTongyi

from langchain.chains import LLMChain

from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate

from langchain.chains import SequentialChain

# 设置 API 密钥

os.environ["DASHSCOPE_API_KEY"] = 'sk-63f00f6776f197ea'

# 初始化通义千问模型

llm = ChatTongyi()

# 提示模板 1:将评论翻译成中文

first_prompt = ChatPromptTemplate.from_template(

    "将以下评论翻译成中文:"

    "\n\n{Review}"

)

# 链 1:输入= Review,输出= Chinese_Review

chain_one = LLMChain(

    llm=llm,

    prompt=first_prompt,

    output_key="Chinese_Review"# 定义输出变量的名称

)

# 提示模板 2:总结中文评论

second_prompt = ChatPromptTemplate.from_template(

    "请用一句话总结以下评论:"

    "\n\n{Chinese_Review}"

)

# 链 2:输入= Chinese_Review,输出= summary

chain_two = LLMChain(

    llm=llm,

    prompt=second_prompt,

    output_key="summary"# 定义输出变量的名称

)

# 提示模板 3:检测评论的语言

third_prompt = ChatPromptTemplate.from_template(

    "以下评论是用什么语言写的:\n\n{Review}"

)

# 链 3:输入= Review,输出= language

chain_three = LLMChain(

    llm=llm,

    prompt=third_prompt,

    output_key="language"# 定义输出变量的名称

)

# 提示模板 4:根据总结和语言生成回复

fourth_prompt = ChatPromptTemplate.from_template(

    "根据以下总结和指定语言,以一个商家的视角,写一条对应语言的后续回复(最终只需要输出一条即可):"

    "\n\n总结: {summary}\n\n语言: {language}"

)

# 链 4:输入= summary, language,输出= followup_message

chain_four = LLMChain(

    llm=llm,

    prompt=fourth_prompt,

    output_key="followup_message"# 定义输出变量的名称

)

# 创建 SequentialChain,将所有链条整合为一个流程

# 输入= Review,输出= Chinese_Review, summary, followup_message

overall_chain = SequentialChain(

    chains=[chain_one, chain_two, chain_three, chain_four],  # 定义链条的顺序

    input_variables=["Review"],  # 定义输入变量

    output_variables=["Chinese_Review", "summary", "followup_message"],  # 定义输出变量

)

# 提取评论并运行链条

review = 'I love this product!'  

print(overall_chain(review))

通过这个例子,我们可以清晰地看到,由于这种链式结构允许自定义内部的输入和输出,它非常适合处理复杂的任务场景,例如:

1. 整合来自不同渠道的信息(如数据分析和用户行为总结)。
2. 将任务分解为多个步骤进行处理,然后汇总结果。
3. 创建复杂的工作流程,例如多步骤问答、多段落文本生成和多维度分析等。

这种链式结构的灵活性和可定制性使其成为处理复杂任务的理想选择,能够有效地支持各种高级应用场景。

小结

SimpleSequentialChain 适合于那些需要单一输入和单一输出的场景,任务按照顺序一步步处理,每一步的输出直接成为下一步的输入。这种结构简单直观,非常适合那些逻辑线性、步骤明确且清晰的工作流程。

而 SequentialChain 则是对 SimpleSequentialChain 的扩展,它支持多输入和多输出,提供了更大的灵活性。这种结构能够将复杂的任务分解成多个部分,并通过明确的输入输出变量将它们连接起来,从而实现更复杂的流程设计和任务整合。

通过这两种链结构,我们不仅可以清晰地定义任务逻辑,还可以灵活地适应不同的场景需求。例如,在多语言客户服务场景中,SequentialChain 可以轻松地完成从评论翻译、总结、语言检测到个性化回复生成的整个工作流程。

总的来说,无论是处理单一线性任务,还是需要多路并行和输出合并的复杂流程,LangChain 提供的链式工具都能显著提高大语言模型任务的执行效率和可扩展性,为开发者构建智能化工作流提供了强有力的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟卡 WildCard (野卡) 保姆级开卡教程

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学,要了解不同平台(Grok、Talkatone 等)的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时,一般都需要使…

计算机数据库三级刷题总结(博主89分已过,总结的内容分享)

计算机数据库三级刷题总结(博主89分已过,总结的内容分享) 文章目录 计算机数据库三级刷题总结(博主89分已过,总结的内容分享)一、 数据库设计阶段二、事务相关三、数据库设计顺序四、数据库三级模式与二层映…

记录一些面试遇到的问题

重载和重写的区别 重载是overload,覆盖是override 重载属于编译时多态,覆盖属于运行时多态 运行时多态和编译时多态 运行时多态指的是在运行的时候才知道要调用哪一个函数,编译时多态是指在编译的时候就知道调用哪一个函数。 运行时多态…

HBuilder X 使用 TortoiseSVN 设置快捷键方法

HBuilder X 使用 TortoiseSVN 设置快捷键方法 单文件:(上锁,解锁,提交,更新) 安装好 TortoiseSVN ,或者 按图操作: 1,工具栏中 【自定义快捷键】 2,点击 默认的快捷键设置&…

JmeterHttp请求头管理出现Unsupported Media Type问题解决

JmeterHttp请求头管理出现Unsupported Media Type问题解决 大多数的app与pc端压测的时候都会出现这种情况 当我们在jemter测试当中当中遇见Unsupported Media Type,有一种可能就是我们请求的网页的content-Type的类型与我们测试的时候的类型不一致 解决方法 可以添…

Spring AI 1.0.0-M6 快速开始(一)

Spring AI 1.0.0-M6 入门一、存储库二、依赖管理完整maven 入门 Spring 是JAVA中我们经常使用的框架之一,Spring AI不断的发展迭代目前已经到M6版本据说上半年会出一个稳定版本。 本节提供了如何开始使用Spring AI的M6。 一、存储库 1.0 M6 -添加Spring存储库 需…

顶点着色器和片段着色器

在Unity渲染中,**顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工:想象你要画一幅由三角形组成的3D模型,顶点…

Impacket工具中的横向渗透利器及其使用场景对比详解

在渗透测试中,横向移动(Lateral Movement)是指攻击者在获得一个系统的控制权限后,通过网络进一步渗透到其他系统的过程。Impacket 是一款强大的渗透测试工具集,提供了多种实现横向渗透的脚本,常见的工具包括…

设计模式|策略模式 Strategy Pattern 详解

目录 一、策略模式概述二、策略模式的实现2.1 策略接口2.2 具体策略类2.3 上下文类2.4 客户端代码2.5 UML类图2.6 UML时序图 三、优缺点3.1 ✅优点3.2 ❌ 缺点 四、最佳实践场景4.1 适合场景描述4.2 具体场景 五、扩展5.1 继承复用机制和复合策略5.2 对象管理:优化策…

迷你世界脚本显示板管理接口:DisPlayBoard

显示板管理接口:DisPlayBoard 迷你世界 更新时间: 2023-04-26 10:21:14 具体函数名及描述如下: 序号 函数名 函数描述 1 showBoard(...) 对玩家显示显示板 2 hideBoard(...) 对玩家隐藏显示板 3 setBoardPicture 对玩家设置显示板的图片…

尚硅谷爬虫note14

一、scrapy scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架 1. 安装 pip install scrapy 或者,国内源安装 pip install scrapy -i https://pypi.douban.com/simple 2. 报错 报错1)building ‘twisted.te…

merge函数

merge函数 今天在刷lc,从灵神题解中学到的 来源:560. 和为 K 的子数组 - 力扣(LeetCode) java8 merge()方法被引入到HashMap类中,用于简化键值对操作,在处理键值对时,提供一个重新映射函数来决…

Notepad++ 8.6.7 安装与配置全攻略(Windows平台)

一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器,支持超过80种编程语言的高亮显示,相比系统自带记事本具有以下优势: 轻量高效:启动速度比同类软件快30%插件扩展:支持NppExec、JSON Viewer等200插件跨文…

建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)

这次我们来制作《红楼梦》各章节的分布情况: 源代码: import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…

C++:#ifndef 头文件保护机制详解

在C开发中,头文件可能会被多个源文件包含,导致编译错误。为了避免这种情况,我们使用了头文件保护机制(防止重复包含)。 头文件保护的原理 通过预处理指令#ifndef(如果没有定义)和#define&…

利用MQ自动取消未支付超时订单最佳实践

一、利用MQ自动取消未支付超时订单最佳实践 1、基于 RocketMQ 延迟消息 1.1:延迟消息 当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。 1.2:实现流程 &am…

基于 ChatGPT 创建专属 GPTs

文章目录 基于 ChatGPT 创建专属 GPTs一、效果展示1.1 中文命名专家1.2 行程小助手 二、核心配置2.1 Instructions2.3 Actions 三、Agent 简介3.1 功能框架3.2 工作流程3.3 意图识别 四、数据流程 基于 ChatGPT 创建专属 GPTs ChatGPT 具备定制 GPTs 的能力,能够通…

Spring Boot WebFlux 中 WebSocket 生命周期解析

Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外,为了确保 WebSocket 连接的稳定性和可靠性,我们可以加入重试…

【数据挖掘】异构图与同构图

在图论(Graph Theory)中,异构图(Heterogeneous Graph)和同构图(Homogeneous Graph)是两种不同的图结构概念,它们的主要区别在于节点和边的类型是否单一。 1. 异构图(Hete…

Golang实践录:go发布版本信息收集

go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多&#xf…