(三)链式工作流构建——打造智能对话的强大引擎
上一篇:(二)输入输出处理——打造智能对话的灵魂
在前两个阶段,我们已经搭建了一个基础的智能对话,并深入探讨了输入输出处理的细节。今天,我们将进入智能对话的高级阶段——链式工作流构建。这一阶段的目标是通过链式调用和复杂逻辑编排,让对话系统具备更强大的处理能力和更灵活的应用场景。
(建议从第一篇食用)
一、链式调用:构建任务处理流水线
链式调用是智能对话的核心功能之一,它允许我们将多个处理步骤串联起来,形成一个完整的任务处理流水线。通过这种方式,我们可以让智能对话自动完成一系列复杂的任务。
导入相关包
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 技术,实现多步骤任务的自动化处理。
- 实时交互优化:通过流式处理和异步技术,进一步提升系统的响应速度。
- 多模态支持:支持图片、语音等多种输入输出形式,让对话系统更加多样化。
祝我们学习愉快! 😊
下一篇:(四)数据检索与增强生成——让对话系统更智能、更高效