基于 LangChain 的提示链技术:全面详解

作者

Vrunda Gadesha

AI Advocate | Technical Content Author

提示链是使用大型语言模型 (LLM) 构建高级工作流的一个基础概念。它涉及将多个提示按逻辑顺序链接起来,其中一个提示的输出作为下一个提示的输入。这种模块化方法对于解决多步骤文本处理、摘要、问答等复杂任务非常有效。

LangChain 是一个多功能框架,旨在简化此类工作流程的创建。该平台提供多种工具来管理大语言模型(例如 IBM® Granite 模型或 OpenAI 的 GPT 生成式预训练转换器模型),支持自定义提示词设计,并能将其连接成可复用的处理链。通过将管理提示词的复杂性抽象化,LangChain 使开发人员能够专注于解决问题,而无需编排与大语言模型 (LLM) 的交互。

在本教程中,我们将:

  1. 探索不同类型的提示链(顺序链、分支链、迭代链等)。
  2. 实现一个结合顺序链、分支链与迭代链类型的通用链式示例。
  3. 利用 LangChain 的内置类(如 PromptTemplate、LLMChain 和 SequentialChain)来定义和管理工作流。

LangChain 如何管理提示链

LangChain 为构建聊天机器人应用中的模块化工作流提供了一个强大的框架。通过结合结构化提示、动态链式流程以及先进的大语言模型集成技术,该框架使开发人员能够创建可扩展的自适应管道。这些管道既能利用 RAG(检索增强生成)技术,又能输出如 JSON 之类的结构化数据。以下是 LangChain 如何有效处理提示链:

提示词抽象化:LangChain 利用 from_template 方法为每个步骤设计结构化的输入/输出工作流,从而简化复杂聊天机器人操作的处理。

LLM 集成:该框架可与各种 LLM(如 IBM Granite、OpenAI 和 Hugging Face 的模型)无缝集成, 可针对自定义任务进行微调。

链式管理:LangChain 的 SequentialChain 与 SimpleSequentialChain 可为聊天机器人流水线实现模块化工作流,同时 StrOutputParser 能确保输出结构化数据(如 JSON)。

动态工作流:LangChain 使用 ConditionalChain 和 systemmessage 模板等工具,支持自适应工作流,与动态内容生成的 RAG(检索增强生成)原则保持一致。

提示图 图 - 1 使用 langchain 的提示链框架

在本教程结束时,您将熟练掌握如何使用 LangChain 为各种应用程序构建模块化且可扩展的工作流。

提示链类型

提示链使您能够设计这样的工作流:将一个步骤的输出传递至后续步骤。不同类型的链支持不同的工作流,从简单的顺序任务到更复杂、动态的过程。下面简单介绍一下提示链的类型:

  • 顺序链:最直接的链类型,即将前一个提示词的输出直接作为下一个提示词的输入。此选项非常适用于线性推进的任务。[1]

  • 分支链:在该模式下,单个输出可拆分为多个并行工作流。每个分支独立处理输出结果。[2]

  • 迭代链:该模式通过重复运行提示词或链式流程,直至满足特定条件为止。此选项对于优化输出很有用。[3]

  • 分层链:这种类型将大型任务分解为较小的子任务,这些子任务按分层执行。较低级别的输出为较高级别的任务提供支持。[4]

  • 条件链:根据先前提示的输出动态选择后续步骤。它支持在工作流中进行决策。

  • 多模态链:多模态链将处理不同数据类型(例如文本、图像或音频)的提示集成在一起。它适用于结合多种模态的应用。[2]

  • 动态链:动态链会根据实时输出或变化的条件调整工作流。它为提示链增加了灵活性。[5]

  • 递归链接:在递归链中,大的输入被分割成较小的块进行单独处理,然后将结果合并。这对于处理长文档或数据集非常有用。[6]

  • 反向链:反向链从预期输出开始,反向推导出实现该结果所需的输入或步骤。它对于解决问题和调试非常有用。[5]

每种链式方式都适用于特定的使用场景,因此根据任务的复杂性和需求选择合适的方式至关重要。

用例 - 多步骤文本处理

在此工作流中,我们利用聊天模型和提示工程来处理客户反馈,从而构建一个可扩展的文本处理流水线。本教程的以下阶段将展示由生成式人工智能驱动的顺序链、分支链和迭代链技术。

提取关键词(顺序链)

  • 以自然语言形式提供的输入文本或用户输入会通过提示模板进行处理,以识别重要关键词。
  • 此步骤使用顺序链来确保提取的关键字直接进入后续任务。

生成情感摘要(分支链)

  • 提取的关键词会传入聊天模型,以生成情感摘要。
  • 分支链处理允许并行的摘要路径,以根据上下文调整输出。

完善情感摘要(迭代链)

  • 如果情感摘要不符合预定义的质量条件,则会通过优化提示传递。
  • 迭代链可以进行重新处理,直到输出达到预期的精度水平。

最终输出

  • 精炼后的情感摘要将作为最终输出呈现,为用户提供完善的洞察。
  • 这展示了提示工程、生成式 AI 和先进链技术的集成。

这种方法将 Python 中的顺序链、分支链和迭代链与聊天模型和提示工程相结合。它可确保稳健地处理客户反馈,利用生成式 AI 进行关键字提取、情感分析和优化。

先决条件

您需要一个 IBM® Cloud 帐户才能创建 watsonx.ai项目。

步骤

第 1 步:设置环境

虽然您可以选择多种工具,本教程将引导您如何设置 IBM 帐户以使用 Jupyter Notebook。

  1. 使用您的 IBM Cloud 帐户登录 watsonx.ai
  2. 创建 watsonx.ai 项目。您可以从项目内部获取项目 ID。点击管理选项卡。然后,从常规页面的详细信息部分复制项目 ID。您需要此 ID 来完成本教程。
  3. 创建一个 Jupyter Notebook

此步骤将打开一个笔记本环境,可在其中复制本教程中的代码。或者,您可以将此笔记本下载到本地系统并将其作为资产上传到您的 watsonx.ai 项目。要查看更多 Granite 教程,请访问 IBM Granite 社区。本教程也可在 GitHub 上找到。

第 2 步:设置 watsonx.ai 运行时服务和 API 密钥

  1. 创建 watsonx.ai 运行时服务实例(选择 Lite 计划,这是一个免费实例)。
  2. 生成 API 密钥
  3. 将 watsonx.ai 运行时服务与您在 watsonx.ai 中创建的项目关联。

第 3 步:安装软件包

我们需要一些库来使用 langchain 框架和 watsonxLLM。我们首先安装所需的软件包。

注意:如果您使用的是旧版本的 pip,可以使用命令 pip install --upgrade pip 来升级。此步骤可帮助您轻松安装最新的软件包,而这些软件包可能与旧版本不兼容。但如果您已经在使用最新版本,或者最近刚升级过软件包,那么可以跳过此命令。

!pip install --upgrade pip
%pip install langchain
!pip install langchain-ibm

第 4 步:导入所需库

此代码块导入基本的 Python 库和工具,以使用 LangChain 和 IBM Watson LLM 构建和管理 LLM 应用程序。

os 模块用于访问环境变量,例如项目凭据或 API 密钥。

watsonxLLM 是 langchain_ibm 的一个模块,集成了 IBM Watson LLM,用于从生成式 AI 模型生成输出。

PromptTemplate 可帮助创建可重复使用的提示模板,确保提示工程的输入结构和灵活性。

LLMChain 构建单个任务链,而

SequencialChain 将多个步骤链接到一个工作流中,“getpass”可安全地检索敏感信息(例如 API 密钥),而不会在屏幕上显示。

import os
from langchain_ibm import WatsonxLLM
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain
import getpass

第 5 步:设置凭据

此代码设置了访问 IBM Watson machine learning (WML) API 的凭据,并确保正确配置项目 ID。

  • 使用 WML 服务 URL 和 API 密钥创建字典凭据。通过使用 getpass.getpass 安全收集 API 密钥,避免泄露敏感信息。
  • 该代码尝试使用 os.environ 函数从环境变量中获取 PROJECT_ID。如果未找到 PROJECT_ID,则提示用户通过输入法手动输入。
# Set up credentials
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com", # Replace with the correct region if needed
    "apikey": getpass.getpass("Please enter your WML API key (hit enter): ")
}

# Set up project_id
try:
    project_id = os.environ["PROJECT_ID"]
except KeyError:
    project_id = input("Please enter your project_id (hit enter): ")

第 6 步:初始化大语言模型

此代码初始化 IBM Watson LLM 以便在应用程序中使用:

  1. 此代码使用 ibm/granite-3-8b-instruct 模型(该模型专为基于指令的生成式 AI 任务而设计)创建一个 WatsonxLLM 实例。
  2. 将之前设置的凭证中的 urlapikeyproject_id 值传递过去,以验证并连接到 IBM Watson LLM 服务
  3. 配置 max_new_tokens 参数,以限制模型在每个响应中生成的令牌数量(本例中为 150 个令牌)。

此步骤让 Watson LLM 做好准备,以便在工作流中生成响应。

# Initialize the IBM LLM
llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials["url"],
    apikey=credentials["apikey"],
    project_id=project_id,
    params={
    "max_new_tokens": 150
    }
)   

第 7 步:定义提示模板

此代码定义了文本处理工作流的三个阶段的提示:

  1. 关键字提取:keyword_prompt 旨在从提供的文本中提取最重要的关键字。它使用占位符 {text} 来动态插入输入。
  2. 情感摘要生成:sentiment_prompt 将提取的 {keywords} 作为输入生成反馈的情感摘要。该模板确保情感生成集中于所提供的关键词。
  3. 摘要的细化:refine_prompt 通过使用 {sentiment_summary} 作为输入来改进情感摘要。它注重使输出简洁、精确。

这些 PromptTemplate 实例为 LLM 应用程序启用可重用和结构化的提示工程。

# Define Prompt Templates

# Prompt for extracting keywords
keyword_prompt = PromptTemplate(
    input_variables=["text"],
    template="Extract the most important keywords from the following text:\n{text}\n\nKeywords:"
)

# Prompt for generating sentiment summary
sentiment_prompt = PromptTemplate(
    input_variables=["keywords"],
    template="Using the following keywords, summarize the sentiment of the feedback:\nKeywords: {keywords}\n\nSentiment Summary:"
)

# Prompt for refining the summary
refine_prompt = PromptTemplate(
    input_variables=["sentiment_summary"],
    template="Refine the following sentiment summary to make it more concise and precise:\n{sentiment_summary}\n\nRefined Summary:"
)

第 8 步:创建链

这段代码定义了 LLM 链,将提示与已初始化的 IBM Watson LLM 连接起来,并为每个阶段分配唯一的输出键:

  1. 关键词链:keyword_chain 使用keyword_prompt 从输入文本中提取关键词。结果存储在唯一的键“keywords”下,供后续步骤使用。
  2. 情感链:sentiment_chain 获取提取的关键字,并使用 sentiment_prompt 生成情感摘要。输出被标记为“sentiment_summary”。
  3. 精炼链:refine_chain 使用 refine_prompt 来处理生成的情感摘要。最终精炼后的输出将使用键 "refined_summary" 进行存储。

这些 LLMChain 实例支持模块化任务执行,促进逐步的 LLM 应用程序工作流。

# Define Chains with Unique Keys

# Chain to extract keywords
keyword_chain = LLMChain(
    llm=llm,
    prompt=keyword_prompt,
    output_key="keywords" # Unique key for extracted keywords
)

# Chain to generate sentiment summary
sentiment_chain = LLMChain(
    llm=llm,
    prompt=sentiment_prompt,
    output_key="sentiment_summary" # Unique key for sentiment summary
)

# Chain to refine the sentiment summary
refine_chain = LLMChain(
    llm=llm,
    prompt=refine_prompt,
    output_key="refined_summary" # Final refined output
)

第 9 步:组合链

这段代码将之前定义的链组合成一个顺序工作流,从而实现对文本输入的逐步处理。SequentialChain 按预定顺序连接 keyword_chainsentiment_chainrefine_chain,确保前一个链的输出作为下一个链的输入。工作流被配置为接受输入作为初始输入,最终输出即精炼情感摘要,存储在键 "refined_summary" 下。此设置可简化且高效地执行 LLM 应用程序,从而确保连贯且模块化的处理流水线。

# Combine Chains into a Sequential Workflow

workflow = SequentialChain(
    chains=[keyword_chain, sentiment_chain, refine_chain],
    input_variables=["text"], # Initial input for the workflow
    output_variables=["refined_summary"] # Final output of the workflow
)

第 10 步:运行工作流

在此代码块中,我们将运行整个工作流。首先,我们有一个定义为 feedback_text 的多行反馈字符串,其中包含有关应用程序的正面和负面的用户评论。workflow.run 方法使用提供的输入通过顺序链(关键字提取、情感分析和细化)处理反馈。并将提炼后的情感摘要直接打印为最终结果。

# Example Input Text

feedback_text = """
    I really enjoy the features of this app, but it crashes frequently, making it hard to use.
    The customer support is helpful, but response times are slow.

    I tried to reachout to the support team, but they never responded

    For me, the customer support was very much helpful. Ihis is very helpful app. Thank you for grate services.

"""

# Run the Workflow

result = workflow.run({"text": feedback_text})

# Display the Output

print("Refined Sentiment Summary:")
print(result) # Directly print the result since it is a string

输出

精炼的情感摘要:

用户的不满情绪主要源于应用程序频繁崩溃和客户支持响应缓慢,尽管他们对应用程序的功能和偶尔有帮助的客户支持表示赞赏。为了提高用户满意度,开发团队应该专注于解决应用程序崩溃问题,并加快客户支持响应速度。

精炼的情感摘要是对反馈意见简洁明了的评价。它突出了用户对应用功能的认可,同时表达了对频繁崩溃和缓慢客服支持的抱怨,体现了该工作流有效提炼关键洞察的能力。

如何选择正确的链式类型

为 LLM 应用程序选择合适的链接类型涉及评估关键因素,以确保效率和连贯性:

任务复杂性:对于多步骤的任务,使用可运行的工作流。少样本示例或 chatprompttemplate 可以帮助构建需要不同提示的复杂任务。

依赖关系:如果一个步骤的输出是下一个提示的占位符,请使用顺序链。输出解析器确保输出顺利过渡到结构化输入。

适应性:对于动态工作流(例如涉及 LangChain 代理的流程),迭代链允许实时调整参数和下一步提示。

数据模态:选择与各种数据类型兼容的工作流程。使用嵌入方法处理文本和向量数据,或利用 LangChain 表达式语言实现灵活操作。

通过考虑这些因素,您可以构建一个稳健且可适应的 LLM 应用,并实现连贯的链式工作流。

摘要

提示链是一种用于构建复杂自然语言处理 (NLP) 工作流的多功能技术。在本教程中,我们探讨了各种链式类型,并演示了一个整合多种链式方法的通用示例。通过尝试这些方法,您可以解锁语言模型在应用程序中的全部潜力。

相关解决方案
IBM® watsonx.ai

使用面向 AI 构建器的新一代企业级开发平台 IBM watsonx.ai,可以训练、验证、调整和部署生成式 AI、基础模型和机器学习功能。使用一小部分数据,即可在很短的时间内构建 AI 应用程序。

深入了解 watsonx.ai
人工智能 (AI) 解决方案

借助 IBM 业界领先的 AI 专业知识和解决方案组合,让 AI 在您的业务中发挥作用。

深入了解人工智能解决方案
人工智能 (AI) 咨询服务

IBM Consulting AI 服务有助于重塑企业利用 AI 实现转型的方式。

深入了解人工智能服务
采取下一步行动

通过使用 AI,IBM Concert 可揭示有关运营的重要洞察分析,并提供特定于应用程序的改进建议。了解 Concert 如何推动您的业务向前发展。

深入了解 Concert 深入了解业务流程自动化解决方案
脚注

[1] Roegiest, A., & Chitta, R. (2024). Answering Questions in Stages: Prompt Chaining for Contract QA.

[2] Ge, J., Luo, H., Qian, S., Gan, Y., Fu, J., & Zhang, S. (2023). 视觉语言模型中的思维链提示调整。

[3] Sun, S., Yuan, R., Cao, Z., Li, W., & Liu, P. (2024). 提示链式还是逐步提示?文本摘要中的改进。, 7551-7558. https://arxiv.org/abs/2406.00507.

[4] Huang, Q., Zhu, J., Li, Z., Xing, Z., Wang, C., & Xu, X. (2023). PCR-Chain:在 Frozen Copilot 上通过分层链提示实现部分代码重用。2023 IEEE/ACM 第 45 届国际软件工程会议配套论文集 (ICSE-Companion),1-5。https://ieeexplore.ieee.org/document/10172550.

[5] Wu, T., Jiang, E., Donsbach, A., Gray, J., Molina, A., Terry, M., & Cai, C. (2022). PromptChainer:通过可视化编程链接大型语言模型提示。CHI 计算系统中的人为因素会议扩展摘要。https://dl.acm.org/doi/10.1145/3491101.3519729.

[6] Trautmann, D. (2023). Large Language Model Prompt Chaining for Long Legal Document Classification. ArXiv, abs/2308.04138. https://arxiv.org/abs/2308.04138.