(三)链式工作流构建——打造智能对话的强大引擎

上一篇:(二)输入输出处理——打造智能对话的灵魂

在前两个阶段,我们已经搭建了一个基础的智能对话,并深入探讨了输入输出处理的细节。今天,我们将进入智能对话的高级阶段——链式工作流构建。这一阶段的目标是通过链式调用和复杂逻辑编排,让对话系统具备更强大的处理能力和更灵活的应用场景。(建议从第一篇食用)

一、链式调用:构建任务处理流水线

链式调用是智能对话的核心功能之一,它允许我们将多个处理步骤串联起来,形成一个完整的任务处理流水线。通过这种方式,我们可以让智能对话自动完成一系列复杂的任务。

导入相关包

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables import RunnableBranch
from langchain_core.runnables.base import RunnableEach

基础链式调用

chain = (RunnablePassthrough()  # 传递原始输入| ChatPromptTemplate.from_template("将以下文本翻译成{language}:{text}")| chat  # GLM-4-Flash模型| StrOutputParser()  # 提取文本内容
)
result = chain.invoke({"text": "Hello, world!", "language": "中文"})
print(result)

这段代码展示了如何通过链式调用实现文本翻译功能。输入的文本首先被传递到模板中,然后由模型进行处理,最后通过解析器提取结果。这种流水线式的处理方式不仅高效,而且易于扩展。

结果如下:

你好,世界!

多步骤组合链

# 定义子链1:生成菜谱
recipe_chain = (ChatPromptTemplate.from_template("生成{cuisine}菜谱")| chat| StrOutputParser()
)# 定义子链2:生成购物清单
shopping_chain = (ChatPromptTemplate.from_template("根据菜谱列出食材:{recipe}")| chat| StrOutputParser()
)# 组合链
full_chain = {"recipe": recipe_chain,  # 先执行菜谱生成"cuisine": RunnablePassthrough()  # 传递原始输入
} | shopping_chain  # 将菜谱结果传递给购物清单链result = full_chain.invoke("川菜")
print(result)

通过多步骤组合链,我们可以将多个子任务串联起来,形成一个完整的任务流程。这种设计方式特别适合需要多步骤处理的复杂任务,比如菜谱生成和购物清单生成。

结果如下:

根据您提供的麻婆豆腐菜谱,以下是所需的食材列表:1. 老豆腐
2. 猪肉末
3. 姜蒜末
4. 葱花
5. 豆瓣酱
6. 花椒粉
7. 食用油
8. 生抽
9. 老抽(可选)
10. 料酒
11. 水淀粉
12. 鸡精或味精(可选)
13. 清水
14.

二、异步处理:提升系统的并发能力

在实际应用中,对话系统往往需要同时处理多个请求。异步处理技术可以显著提升系统的并发能力,让系统更加高效。

基础异步调用

import asyncioasync def async_query():chain = (ChatPromptTemplate.from_template("用比喻解释{concept}")| chat| StrOutputParser())return await chain.ainvoke({"concept": "机器学习"})# 运行异步任务
result = await async_query()
print(result)

通过异步调用,我们可以让系统在等待一个任务完成的同时处理其他任务,从而提高系统的整体效率。

结果如下:

机器学习就像是一个聪明的学生,他不需要老师反复讲解,只要给他一些例子,他就能自己学会如何解决问题。这个过程就像是一个孩子通过观察和模仿来学习说话和走路。在这个比喻中,例子就是“数据”,而学生就是“算法”。算法通过不断分析这些数据,就像孩子通过不断模仿来学习语言和动作一样,最终能够独立地识别模式和做出决策。

批量异步处理

async def batch_process():chain = (ChatPromptTemplate.from_template("生成关于{theme}的标题")| chat| StrOutputParser())# 并行处理多个请求tasks = [chain.ainvoke({"theme": "人工智能"}),chain.ainvoke({"theme": "气候变化"})]return await asyncio.gather(*tasks)results = await batch_process()
print(results)

批量异步处理可以同时处理多个请求,特别适合需要同时生成多个结果的场景。

结果如下:(由于是批量处理,所以返回是列表形式)

['1. "人工智能:未来科技浪潮中的引领者"\n2. "智能革命:人工智能如何改变我们的世界"\n3. "从科幻走向现实:人工智能的无限可能"\n4. "AI赋能未来:探索人工智能的无限边界"\n5. "智能时代来临:人工智能如何重塑产业格局"\n6. "人工智能:开启智慧生活新篇章"\n7. "智能进化论:人工智能技术发展历程解析"\n8. "AI赋能教育:人工智能如何助力人才培养"\n9. "人工智能:推动医疗健康产业变革的力量"\n10. "智能时代,人工智能如何助力社会治理创新"', '1. "全球气候变暖:挑战与应对之道"\n2. "极端天气频发,气候变化警钟长鸣"\n3. "绿色未来:携手应对气候变化危机"\n4. "气候变化下的生态危机:我们能做什么?"\n5. "低碳生活,共建地球家园——应对气候变化行动指南"\n6. "气候变化对农业的影响:挑战与转型之路"\n7. "从巴黎协定到行动:全球气候治理的挑战与机遇"\n8. "城市如何应对气候变化:可持续发展的绿色策略"\n9. "气候变化与人类健康:揭示未知风险与应对策略"\n10. "绿色能源革命:推动全球气候治理新格局"']

三、流式处理:实时响应与分析

流式处理技术可以让我们实时获取模型的输出,并在输出过程中进行分析和处理。这种技术特别适合需要实时反馈的场景。

基础流式输出

chain = (ChatPromptTemplate.from_template("用100字介绍{topic}")| chat| StrOutputParser()
)for chunk in chain.stream({"topic": "人工智能"}):print(chunk, end="", flush=True)

通过流式输出,我们可以实时获取模型的输出,这在需要即时反馈的场景中非常有用。

结果如下:(实时输出结果,好像打字机一样,一个或几个字输出)

人工智能是计算机科学领域,研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统。它通过算法和机器学习,使计算机具备学习、推理、感知和决策能力,广泛应用于各行各业。

带中间状态的流式处理

def word_counter(input_text):word_count = len(input_text.split())yield f"当前字数:{word_count}\n"analysis_chain = (ChatPromptTemplate.from_template("分析{AI_tool}的市场竞争力")| chat| StrOutputParser()| RunnableLambda(word_counter)  # 添加自定义处理
)for chunk in analysis_chain.stream({"AI_tool": "deepseek"}):print(chunk)

通过在流式处理中加入自定义逻辑,我们可以在输出过程中实时分析和处理数据。

结果如下:

当前字数:61

四、复杂逻辑编排:让系统更智能

复杂逻辑编排是智能对话系统的核心能力之一。通过条件分支和循环处理,我们可以让系统根据不同的输入执行不同的逻辑。

条件分支路由

def classify_input(text: str) -> str:if "笑话" in text:return "joke"elif "新闻" in text:return "news"return "other"# 定义子链
joke_chain = (ChatPromptTemplate.from_template("生成关于{topic}的笑话")| chat| StrOutputParser()
)
news_chain = (ChatPromptTemplate.from_template("写一则关于{topic}的简讯")| chat| StrOutputParser()
)
default_chain = (ChatPromptTemplate.from_template("回答关于{topic}的问题")| chat| StrOutputParser()
)# 构建分支逻辑
branch = RunnableBranch((lambda x: classify_input(x["topic"]) == "joke", joke_chain),(lambda x: classify_input(x["topic"]) == "news", news_chain),default_chain
)# 测试分支
print(branch.invoke({"topic": "人工智能笑话"}))  # 输出笑话
print(branch.invoke({"topic": "科技新闻"}))  # 输出简讯

通过条件分支,我们可以让系统根据输入的不同执行不同的逻辑。这种设计方式特别适合需要处理多种类型输入的场景。

结果如下:

# 第一个输出
为什么人工智能不喜欢去健身房?因为它只想“训练数据”,而不是“锻炼身体”!😄
# 第二个输出
【科技新闻简讯】
我国科学家成功研发新型太阳能电池,效率提升30%近日,我国科研团队在太阳能电池领域取得重大突破,成功研发出一种新型太阳能电池。该电池采用新型材料,通过优化设计,将光电转换效率提升至30%,创下了国际领先水平。据悉,该技术有望广泛应用于光伏发电、太阳能充电等领域,为我国新能源产业发展提供有力支持。目前,该成果已申请国际专利,并计划在未来五年内实现产业化应用。

循环处理

prompt = ChatPromptTemplate.from_template("什么是{topic}")
model = chat
output_parser = StrOutputParser()chain = prompt | model | output_parserloop_chain = RunnableEach(bound=chain)response = loop_chain.invoke([{'topic': '人工智能'},{'topic': '机器学习'},{'topic': '深度学习'}
])
print(response)

通过循环处理,我们可以批量处理多个输入,特别适合需要批量生成内容的场景。

结果如下:

['人工智能(Artificial Intelligence,简称AI)是指由人制造出来的系统所表现出的智能行为。这种智能可以是机器学习、自然语言处理、视觉识别、决策制定、问题解决等多种形式。人工智能的目标是使计算机能够执行通常需要人类智能才能完成的任务。\n\n以下是人工智能的一些关键特点:\n\n1. **机器学习**:通过算法从数据中学习并改进性能。\n2. **自然语言处理**:让机器能够理解和生成人类语言。\n3. **计算机视觉**:让机器能够“看到”和理解图像或视频。\n4. **机器人技术**:将人工智能集成到物理机器人中。\n5. **专家系统**:模拟人类专家解决问题的能力。\n\n人工智能的应用领域非常广泛,包括但不限于以下方面:\n\n- **医疗**:辅助诊断、药物研发等。\n- **交通**:自动驾驶、交通流量管理等。\n- **金融**:风险评估、欺诈检测等。\n- **教育**:个性化学习、自动评分等。\n- **娱乐**:游戏、虚拟助手等。\n\n人工智能的发展对人类社会具有深远的影响,但也带来了一些伦理和安全方面的挑战。因此,在推动人工智能发展的同时,也需要关注其潜在的风险和影响,并采取措施确保其健康、可持续发展。', '机器学习是人工智能(AI)的一个分支,它使计算机系统能够从数据中学习并做出决策或预测,而无需显式编程。简单来说,机器学习就是让计算机通过经验改进其性能的过程。\n\n以下是机器学习的一些关键点:\n\n1. **数据驱动**:机器学习依赖于大量数据来训练模型。这些数据可以是结构化的(如数据库中的表格)或非结构化的(如图像、文本、音频和视频)。\n\n2. **算法**:机器学习使用各种算法来分析数据并从中学习。这些算法可以是监督学习、无监督学习或强化学习。\n\n3. **监督学习**:在这种方法中,模型从标记的数据(即已知结果)中学习。例如,通过学习大量已标记的电子邮件,模型可以学会将新电子邮件分类为垃圾邮件或非垃圾邮件。\n\n4. **无监督学习**:在这种方法中,模型从未标记的数据中学习。例如,无监督学习可以用于发现客户购买模式或市场趋势。\n\n5. **强化学习**:在这种方法中,模型通过与环境的交互来学习。它通过尝试不同的行动并从中学习来优化其行为。\n\n6. **应用**:机器学习在各个领域都有广泛的应用,包括自然语言处理、图像识别、推荐系统、医疗诊断、自动驾驶汽车等。\n\n7. **挑战**:尽管机器学习有许多优势,但也面临一些挑战,如数据隐私、偏见、可解释性和伦理问题。\n\n总之,机器学习是一种强大的技术,它使计算机能够从数据中学习,并在此过程中不断提高其性能。', '深度学习是机器学习的一个子领域,主要研究的是如何使用神经网络来模拟人脑处理信息的方式,以实现对数据的自动学习和提取特征。它通过构建具有多层节点的神经网络模型,使得模型能够自动从原始数据中学习到更深层次的特征表示。\n\n以下是深度学习的一些关键点:\n\n1. **神经网络**:深度学习的基础是神经网络,特别是深度神经网络(DNN)。神经网络由多个层组成,包括输入层、隐藏层和输出层。\n\n2. **多层结构**:与传统的单层神经网络相比,深度神经网络包含多个隐藏层,这使得模型能够学习更复杂的特征和模式。\n\n3. **自动特征提取**:深度学习模型可以自动从原始数据中提取特征,无需人工干预。这使得深度学习在图像识别、语音识别等领域具有显著优势。\n\n4. **大规模数据**:深度学习通常需要大量的数据进行训练,以使模型能够学习到有效的特征表示。\n\n5. **优化算法**:深度学习模型通常使用梯度下降等优化算法进行训练,以最小化预测误差。\n\n6. **应用领域**:深度学习在多个领域取得了显著成果,包括图像识别、语音识别、自然语言处理、推荐系统等。\n\n深度学习在近年来取得了巨大进展,推动了人工智能技术的发展。随着计算能力的提升和数据量的增加,深度学习有望在更多领域发挥重要作用。']

总结

链式工作流构建是智能对话的核心能力,它不仅决定了处理效率,还影响着灵活性和扩展性。通过链式调用、异步处理、流式处理和复杂逻辑编排等技术,我们可以让对话变得更加智能、高效和实用。

未来,我们可以进一步探索以下方向:

  • 更复杂的任务编排:结合 RAG 技术,实现多步骤任务的自动化处理。
  • 实时交互优化:通过流式处理和异步技术,进一步提升系统的响应速度。
  • 多模态支持:支持图片、语音等多种输入输出形式,让对话系统更加多样化。

祝我们学习愉快! 😊

下一篇:(四)数据检索与增强生成——让对话系统更智能、更高效

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

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

相关文章

【MATLAB定位例程】TDOA(到达时间差)的chan-tylor,三维环境,附完整代码

该代码实现了基于三维空间的动态目标TDOA定位,结合了Chan算法(解析解)与Taylor级数展开法(迭代优化)的双重优势。 文章目录 运行结果MATLAB代码代码讲解代码功能概述核心算法原理代码结构解析可视化与结果分析运行结果 定位示意图: 三轴状态曲线: 三轴误差曲线: MA…

Golang的文件同步与备份

Golang的文件同步与备份 一、Golang介绍 也称为Go语言,是谷歌开发的一种编程语言,具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库,Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…

ARXML文件解析-2

目录 1 摘要2 常见ARXML文件注意事项以及常见问题2.1 注意事项2.2 常见问题2.3 答疑 3 ARXML解读/编辑指南3.1 解读ARXML文件的步骤3.2 编辑ARXML文件的方法3.3 验证与调试 4 总结 1 摘要 本文主要对ARXML文件的注意事项、常见问题以及解读与编辑进行详细介绍。 上文回顾&…

3535 数组分割

3535 数组分割 ⭐️难度:困难 🌟考点:2023、省赛、动态规划 📖 📚 import java.util.*;public class Main {static int MOD 1000000007;static int N 1005;public static void main(String[] args) {Scanner sc …

Git操作指南

Git操作指南 1.安装并配置Git Git官网:https://git-scm.com/downloads 安装完成后,打开Git Bash,配置Git: git config --global user.email "emailexample.com" git config --global user.name "Your Name&quo…

Linux常用基础命令应用

目录 一、文件与目录操作(12个核心命令)​​ ​​1. pwd - 显示当前路径​​ ​​2. ls - 查看目录内容​​ ​​3. cd - 切换目录​​ ​​4. mkdir - 创建目录​​ ​​5. touch - 创建文件​​ ​​6. cp - 复制文件/目录​​ ​​7. mv - 移动…

zookeeper基本概念和核心作用

图片来源: 02-Zookeeper概念_哔哩哔哩_bilibili02-Zookeeper概念是黑马程序员Zookeeper视频教程,快速入门zookeeper技术的第2集视频,该合集共计24集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilib…

关于HikariDataSource (null)的误解,顺带提出一种mybaits-Plus mapper映射失败的容易被忽视的原因

首先探究此问题并无什么实际意义,纯属是个人好奇使然,也顺带熟悉了一下Springboot 数据库连接的相关问题,本人纯小白说的不对的地方恳请大佬指正!! 关于HikariDataSource (null)的误解 问题的发现 Value("${myba…

Centos7上安装docker - yum在线的方式

步骤一 : 安装 yum-utils yum install -y yum-utils步骤二 : 替换docker 的国内的源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo执行完成后,会在 /etc/yum.repos.d/ 目录下 新增 doc…

250405-VSCode编辑launch.json实现Debug调试Open-WebUI

A. 最终效果 根据__init__.py配置launch.json 根据中utils/chat.py中form_data的messages [{role: user, content: 唐老鸭}],可以找到用户输入,进而通过关键词或模型调用的方式,对敏感问题进行特殊处理。 B. 文件配置 launch.json // { // /…

①(PROFINET 转 Modbus TCP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 PROFINET 转 Modbus TCP MS-GW35 概述 MS-GW35 是 PROFINET 和 Modbus TCP 协议转换网关,为用户提供一种 PLC扩展的集成解决方案,可以轻松容易将 Modbus TCP 网络接入 PROFINET 网络中,方便扩展,不受限制…

分治-归并排序-逆序对问题

目录 1.升序(以右边的合并组为基准) 2.降序(以左边的合并组为基准) 3.逆对序--固定下标 1.升序(以右边的合并组为基准) 找出左边有多少个数比我(nums[right])大 应该在每一次合并之前,进行…

(四)数据检索与增强生成——让对话系统更智能、更高效

上一篇:(三)链式工作流构建——打造智能对话的强大引擎 在前三个阶段,我们已经搭建了一个基础的智能对话,并深入探讨了输入输出处理和链式工作流构建的细节。今天,我们将进入智能对话系统的高级阶段——数…

JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)

这里写目录标题 JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)一、引言二、全面认识Java2.1 Java的起源与发展历程2.2 Java的特性2.2.1 简单性2.2.2 面向对象2.2.3 平台无关性2.2.4 健壮性2.2.5 安全性2.2.6 多线程…

如何查看 MySQL 的磁盘空间使用情况:从表级到数据库级的分析

在日常数据库管理中,了解每张表和每个数据库占用了多少磁盘空间是非常关键的。这不仅有助于我们监控数据增长,还能为性能优化提供依据。 Google Gemini中国版调用Google Gemini API,中国大陆优化,完全免费!https://ge…

[Windows] XHS-Downloader V2.4 | 小红书无水印下载工具 支持多平台批量采集

[Windows] XHS-Downloader 链接:https://pan.xunlei.com/s/VON4ygFN1JcyzLJJIOqIpqodA1?pwdsinu# XHS-Downloader 是一款开源免费的小红书内容下载工具,支持无水印视频 / 图文提取、多链接批量处理及账号作品采集。其核心优势包括: 全平台…

6.1 宽度优先搜索算法(BFS)

宽度优先搜索算法(BFS Breadth first search) 又称广度优先搜索,这种搜索是逐层的,搜索完上层,才会搜索下一层,直到找到目标节点。 搜索过程如图中箭头方向: 【例如】 八数码难题:利用空格的移动&#xff…

基于LSTM的文本分类2——文本数据处理

前言 由于计算机无法认识到文字内容,因此在训练模型时需要将文字映射到计算机能够识别的编码内容。 映射的流程如下: 首先将文字内容按照词表映射到成唯一的数字ID。比如“我爱中国”,将“中”映射为1,将“国”映射到2。再将文…

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合,且不允许重复的成员,不同的是ZSet…

什么是DHCP服务,在生活中的应用是什么?

提起DHCP,不接触互联网的可能会很陌生,其实并没有这么高深,简明扼要的说就是可以自动为连接的设备分配IP地址,子网掩码,网关,dns等网络参数。使连接步骤简化,从而提高效率。 主要功能&#xff…