跳至主要内容

面向数据工程与数据应用的 LangChain 入门

LangChain 是一个将大型语言模型的 AI 融入数据管道与应用的框架。本文概述了 LangChain 能做什么、它解决的问题,以及与数据相关的示例用例。
· 11分钟 阅读

使用 AI 探索

OpenAI GPT、Google BERT、Meta LLaMA 等大型语言模型(LLM)正凭借其强大的文本生成能力,重塑各行各业——从市场文案到数据科学代码乃至诗歌创作,应有尽有。尽管 ChatGPT 凭借直观的对话界面吸引了大部分关注,但若将 LLM 融入其他软件中,仍有更多用武之地。

例如,DataLab 配备了 AI 助手,可帮助您撰写或改进分析中的代码与文本;DataCamp 的交互式课程还提供“解释我的错误”功能,帮助您理解问题出在何处。这些功能由 GPT 提供支持,并通过 OpenAI API 进行访问。

LangChain 在多种 LLM API 之上提供了一个框架,旨在帮助软件开发者和数据工程师在将基于 LLM 的 AI 融入其应用和数据管道时更高效。

本教程详细介绍 LangChain 解决的问题及其主要用例,帮助您理解为何以及在何处使用它。阅读前,了解 LLM 的基本概念会有所裨益。您可以通过教程 How NLP is Changing the Future of Data Science 来温习相关知识。

LangChain 解决了哪些问题?

与 LLM 交互基本有两类工作流程。

  1. “对话式”交互:撰写提示词,发送给 AI,并获取文本回复。
  2. “嵌入式”交互:撰写提示词,发送给 AI,并获取数值数组作为回复。

对话与嵌入这两类流程都存在一些问题,LangChain 正是为解决这些问题而生。

提示词充斥样板化文本

无论是对话还是嵌入,一个突出问题在于:要创建一个好的提示词,远不止定义一项待完成的任务。您还需要描述 AI 的个性与写作风格,并加入鼓励事实准确性的指令。也就是说,您也许会先写出一个描述任务的简单提示词:

Write an outline for a 500-word blog post targeted at teenagers about the health benefits of doing yoga.

然而,为获得更优的回复,您需要写成类似这样:

You are an expert sports scientist. Your writing style is casual but terse.

Write an outline for a 500-word blog post targeted at teenagers about the health benefits of doing yoga.

Only include factually correct information. Explain your reasoning.

提示词中的许多样板文字在不同提示之间通常都相同。理想情况下,您应当只写一次,并能在任意提示中自动复用。

LangChain 通过提供提示模板来解决提示词样板文本的问题。它可以将有用的提示输入(本例中是关于撰写瑜伽健康益处博文的大意)与样板内容(写作风格与事实准确性的要求)组合起来。

回复缺乏结构化

在对话式流程中,模型的回复仅是文本。然而,当 AI 融入软件内部时,通常更希望得到可编程处理的结构化输出。例如,若目标是生成数据集,您会希望回复以 CSV 或 JSON 等特定格式给出。

即便假设您能写出让 AI 持续按所需格式输出的提示词,仍需要一种方式来处理该输出。为此,LangChain 提供了输出解析器工具。

在不同 LLM 之间切换很难

虽然 GPT 极为成功,但市面上还有许多其他 LLM 可用。若直接针对某家公司的 API 编程,就会将您的软件锁定在该生态中。完全可能出现这样的情况:在基于 GPT 构建了 AI 功能后,您意识到产品更需要更强的多语言能力,于是想转向 Polyglot,或从“使用 AI”改为“在产品中内置 AI”,从而需要更紧凑的模型,比如 Stability AI 的 StableLM。

LangChain 提供了一个 LLM 类。这种抽象让在不同模型之间切换,甚至在软件中同时使用多个模型,都变得更加容易。

LLM 的“记忆”很短

LLM 的回复是基于先前的对话(包括用户提示与其先前的回复)生成的。然而,LLM 的记忆相当有限。即便是最先进的 GPT-4,默认的上下文长度也只有 8,000 个 token(约合 6,000 个词)。

在对话式流程中,若对话超出记忆上限,AI 的回复可能会变得前后不一致(因为它不再记得对话的开头)。这在聊天机器人等场景中会成为问题。理想情况下,您希望聊天机器人能回忆起与客户的整段对话,以免提供矛盾信息。

LangChain 通过提供聊天消息历史工具来解决记忆问题。它可以将先前的消息回灌给 LLM,提醒其此前的对话内容。

将 LLM 融入管道较为棘手

在数据管道或软件应用中使用 AI 时,它往往只是大功能块中的一部分。比如,您可能希望先从数据库检索数据,再传给 LLM,随后处理回复并将结果馈入另一个系统。

LangChain 通过链与代理为这类管道式工作流提供工具。链是将多个组件“串联”起来的简单对象(用于线性管道)。代理则更为复杂,允许用业务逻辑来决定组件如何交互。比如,您可能需要根据 LLM 输出进行条件分支,以确定下一步。

向 LLM 传递数据不容易

由于 LLM 以文本为主,如何向模型传递数据常常并不直观。该问题包含两个层面。

其一,您需要将数据存储为一种格式,以便控制将数据集的哪些部分发送给 LLM。(对于 DataFrame 或 SQL 表等“矩形”数据集,通常希望逐行发送数据。)

其二,您必须确定如何在提示词中包含这些数据。最简单的方法是直接将数据集包含在提示中(“提示填充”),但也有更复杂的选项。

LangChain 通过索引解决第一层面的问题。它可以从数据库、JSON 文件、pandas DataFrame、CSV 文件等多种格式中导入数据,并以适合按行送入 LLM 的格式进行存储。

LangChain 提供与索引相关的链来解决第二层面的问题,并为向 LLM 传递数据提供四种技术对应的类。

提示填充是将整个数据集直接插入提示中。此法非常简单,但仅适用于小型数据集。

Map-reduce 将数据拆分为多个块,在每个数据块上使用初始提示调用 LLM(“map” 步骤),随后再用不同的提示、并包含第一轮提示的回复来再次调用 LLM。只要您会想到使用“group by”的场景,这种方法通常都适用。

Refine 是一种迭代的贝叶斯风格方法:先在第一块数据上运行提示,然后对每个新增数据块,使用提示要求 LLM 基于新数据细化结果。若您希望让回复逐步收敛到某个特定输出,此法效果良好。

Map-rerank 是 map-reduce 的一种变体。其流程的第一部分相同:拆分数据并对每个块调用提示。不同之处在于,您会要求 LLM 为其回复提供置信度评分,以便对结果排序。此法非常适用于以推荐为代表、输出为单个“最佳”答案的任务。

LangChain 支持哪些编程语言?

LangChain 可通过 langchain Node 包在 JavaScript 中使用,适合将 AI 嵌入到 Web 应用。

它也可通过 langchain(PyPI、conda)包在 Python 中使用,适合将 AI 融入数据管道或基于 Python 的软件。

LangChain 的主要用例是什么?

凡是可能用到 LLM 的场景,LangChain 都能派上用场。这里我们将围绕数据相关的若干示例展开,说明涉及到的 LangChain 功能。

用自然语言查询数据集

LLM 在数据分析中的一大变革性用例,是能用自然语言生成 SQL 查询(或等价的 Python、R 代码)。这让探索性数据分析对不具备编码技能的人也变得触手可及。

该流程有多种变体。对于小型数据集,您可以让 LLM 直接生成结果。具体做法是用 LangChain 的文档加载器将数据加载为合适的格式,借助与索引相关的链将数据传给 LLM,并使用输出解析器解析回复。

更常见的做法是,将数据结构的细节(如表名、列名与类型,以及哪些列存在缺失值等信息)传给 LLM,要求其给出 SQL/Python/R 代码,然后执行得到的代码。此流程更为简单,因为无需传递数据;不过 LangChain 仍然有用,因为它能将各步骤模块化。

另一种变体是加入第二次对 LLM 的调用,让其对结果进行解读。此类涉及多次调用 LLM 的工作流,正是 LangChain 的强项。在这种情况下,您可以使用聊天消息历史工具,确保对结果的解读与先前提供的数据结构保持一致。

与 API 交互

在诸如构建数据管道等数据用例中,将 LLM 的 AI 纳入其中,往往只是包含其他 API 调用的更长工作流的一部分。比如,您可能希望通过某个 API 获取股票数据,或与云平台交互。

LangChain 的链与代理功能能够将这些步骤顺序连接起来(并可通过额外的业务逻辑实现分支管道),非常契合这一用例。

构建聊天机器人

聊天机器人是最受欢迎的 AI 用例之一,而生成式 AI 使聊天机器人的行为更为逼真,前景可期。然而,控制聊天机器人的个性,以及让其记住对话上下文,往往比较麻烦。

LangChain 的提示模板让您可控地设定聊天机器人的个性(语气与沟通风格)及其给出的回复。

此外,消息历史工具有助于为聊天机器人提供超出 LLM 默认几百或上千词的更长“记忆”,以便在单次或跨多次对话中保持更高的一致性。

其他用法

本教程仅是浅尝辄止。LLM 在数据专业领域还有更多用例。无论您希望创建个人助理、总结报告,还是就支持文档或知识库进行问答,LangChain 都能为您提供一个将 AI 融入任意数据管道或数据应用的框架。

更进一步

有关 LangChain 的内容即将登陆 DataCamp。在此之前,您可以通过 Building Chatbots in Python 课程,学习本文讨论的其中一个用例。

主题