Press "Enter" to skip to content

《在Langchain中使用链条的综合指南》

介绍

迈入语言处理的前沿!在语言成为人类与技术之间的重要纽带的领域中,自然语言处理取得了一些非凡的成就。在这一进展中,有一项具有突破性意义的大型语言模型,它正在重塑我们与基于文本的信息的互动方式。在这个全面的学习之旅中,你将深入了解 LangChain,这是一种前沿工具,正在重新塑造我们与基于文本的信息的互动方式。你是否曾经想过,“Langchain”是什么链条?

《在Langchain中使用链条的综合指南》 四海 第1张

LangChain作为大型语言模型领域的门户独树一帜,它提供了深入理解这些模型如何将原始输入转化为精细和类似人类回答的能力。通过这种探索,你将揭开 LangChain 的基本构建模块,从LLMChain和Sequential Chains到Router Chains的复杂运作。

学习目标

  • 了解 LangChain 的核心组成部分,包括LLMChains和Sequential Chains,看看输入是如何在系统中流动的。
  • 学会以连贯的方式整合不同的元素,探索提示模板和语言模型之间的联系。
  • 获得在实际任务中创建功能性链条的实际经验。
  • 培养通过微调结构、模板和解析技术来提高链条效率的技能。

本文是“数据科学博文马拉松”的一部分。

什么是LLM?

大语言模型(LLM)是一种旨在理解和生成类似人类文本的人工智能类型。这些模型(如OpenAI的GPT-3.5)通过训练大量文本数据来了解人类语言的模式和结构。它们可以执行各种与语言相关的任务,包括翻译、内容生成、回答问题等。

LLMs是自然语言处理中宝贵的工具,广泛应用于聊天机器人、内容生成和语言翻译等领域。

什么是LangChain?

在我们揭开 LangChain Chains 的复杂性之前,让我们先理解 LangChain 本身的精髓。LangChain 是一个强大的库,旨在简化与各种大型语言模型(LLM)提供商的交互,包括OpenAI、Cohere、Bloom、Huggingface等。LangChain 的独特之处在于其能够创建链条和逻辑连接,有助于在一个或多个LLM之间建立桥梁。

《在Langchain中使用链条的综合指南》 四海 第2张

为什么使用LangChain?

LangChain 提供了无限的机会,仅限于你的想象力。

  • 想象一下聊天机器人不仅提供信息,还以智慧和魅力吸引用户。
  • 设想电子商务平台能够准确推荐产品,以至于顾客不得不购买。
  • 设想医疗保健应用提供个性化的医疗见解,赋予个人对自身健康做出明智决策的能力。

通过LangChain,你有创造非凡体验的力量。将这些想法变为现实的潜力就在你的指尖。

了解LangChain中的链条

LangChain 的核心组成部分是被称为 LangChain Chains 的重要组件,它们形成了一个或多个大型语言模型(LLM)之间的核心连接。

《在Langchain中使用链条的综合指南》 四海 第3张

在某些复杂的应用中,有必要将LLMs与其他元素或彼此连接起来。这些链条使我们能够整合多种组件,将它们编织成一个连贯的应用。让我们深入研究不同类型的链条。

此外,LangChain 中链条的结构化方法确保了无缺陷和有效的处理,为开发根据广泛的用户需求定制的先进应用铺平了道路。这在自然语言处理领域代表着重大进步,因为这些复杂的连接作为LangChain的基本框架,促进了多个大型语言模型(LLMs)之间的无缝互动。

但首先,为什么是链式结构?

链式结构由于其将不同组件轻松融合、塑造成一个统一和连贯的应用而变得非常重要。通过创建链式结构,多个元素可以无缝地组合在一起。想象一下这样的场景:创建一个链式结构以接收用户输入,使用PromptTemplate加以整理,并将这个优化后的回答传递给大型语言模型(LLM)。这个简化的过程不仅简化了系统功能,还丰富了系统的总体功能。从本质上讲,链式结构就像铰链一样,无缝连接应用程序的不同部分,增强其功能性。让我们来总结一下:

  • 将提示模板与LLM结合在一起可以实现强大的协同效应。
  • 通过将一个LLM的输出作为下一个LLM的输入,可以连接多个LLM成为一个连续的链式结构。
  • 将LLM与外部数据结合使用可以有效地响应查询。
  • 将LLM与长期记忆(如聊天历史)结合使用可以增强交互的上下文和深度。

此外,链式结构使我们能够通过将多个链式结构连接在一起或将链式结构与其他重要元素结合,构建复杂的应用程序。这种方法为开发应用程序提供了复杂而精细的方式,允许实现复杂和高级的功能。

链式结构的类型

Langchain中有许多不同类型的链式结构可以使用。在这里,我们将介绍三种基本的链式结构——LLM链式结构、连续链式结构和路由链式结构。

LLM链式结构 – 最简单的链式结构

这个系统中最基本的链式结构是LLM链式结构,被广泛认可和应用。它的操作包括一个PromptTemplate、一个OpenAI模型(可以是大型语言模型或ChatModel),以及一个可选的输出解析器。在这个设置中,LLM链接受各种输入参数。它使用PromptTemplate将这些输入转换为一致的提示。然后,将这个精心制作的提示输入到模型中。在接收到输出后,LLM链使用提供的OutputParser进一步优化和格式化结果,以获得最终可用的形式。为了说明LLM链式结构的功能,下面是一个具体的例子:

《在Langchain中使用链条的综合指南》 四海 第4张

  • 它通过接收用户的输入并将其传递给链式结构中的第一个元素(PromptTemplate)来工作,将输入格式化为特定的提示。
  • 然后,将格式化的提示传递给链式结构中的下一个(也是最后一个)元素(LLM)。

创建链式结构 – LLM链式结构

创建链式结构,并且特别是LLM链式结构,是一项细致入微的工作,需要在LangChain中充分利用大型语言模型。这些链式结构充当了复杂渠道的角色,促进了信息和互动的顺畅交流。通过仔细的结构规划,开发人员可以设计出能够理解用户输入、利用LLM生成智能响应并根据需求定制输出的充满活力的应用程序。

现在让我们更深入地了解如何在Langchain中使用LLM链式结构。

导入必要的库

import langchainimport openaifrom langchain.llms import OpenAIfrom langchain.prompts import PromptTemplatefrom getpass import getpassOPENAI_API_KEY = getpass()

初始化LLM和Prompt模板

我们使用特定参数初始化OpenAI大型语言模型,其中包括温度为0.9,影响生成响应的多样性。此外,用户必须定义一个‘PromptTemplate’,以输入一个变量(在本例中为“product”)并创建一个标准化的提示结构。在运行时,占位符‘{product}’可以根据不同的产品名称动态填充。

llm = OpenAI(temperature=0.9,          openai_api_key=OPENAI_API_KEY       )prompt = PromptTemplate(    input_variables=["product"],    template="给一个制造{product}的公司取一个好名字是什么?",)

创建一个链式结构

我们创建了一个’LLMChain’类的实例,使用预定义的OpenAI大型语言模型和指定的提示模板。现在,我们有能力使用chain.run命令将该链应用于“游戏笔记本”等产品。这意味着该链可以动态处理和生成针对该特定产品输入的回应。

from langchain.chains import LLMChainchain = LLMChain(llm=llm, prompt=prompt, verbose=True)print(chain.run("gaming laptop"))

输出:

《在Langchain中使用链条的综合指南》 四海 第5张

基于此,我们得到了一个名为“GamerTech Laptops”的公司名称。

连续链

连续链是将多个独立链合并在一起的链,其中一个链的输出作为连续序列中下一个链的输入。它通过连续运行一系列链来运行。

有两种类型的连续链:

简单连续链,处理单个输入和输出,以及

连续链,同时管理多个输入和输出。

《在Langchain中使用链条的综合指南》 四海 第6张

  • 连续链通过使用一个链的输出作为下一个链的输入来合并各种链。
  • 它通过按顺序执行一系列链来运行。
  • 当您需要利用一个操作的结果作为下一个操作的起点时,创建一个无缝流程的过程时,这种方法非常有价值。

简单连续链

连续链在其最简单的形式中由多个步骤组成,每个步骤接收一个输入并产生一个输出。一个步骤的输出成为下一个步骤的输入。

《在Langchain中使用链条的综合指南》 四海 第7张

这种简单的方法在处理为单个输入和输出设计的子链时非常有效。它确保信息的平稳连续流动,每个步骤将其输出无缝地传递给后续步骤。

构建链 – 简单连续链

简单连续链允许单个输入经历一系列连贯的转换,从而产生精细化的输出。这种连续的方法确保数据的系统和高效处理,使其非常适用于线性信息处理流程至关重要的场景。

导入必要的库

from langchain.llms import OpenAIfrom langchain.chains import LLMChainfrom langchain.prompts import PromptTemplatefrom langchain.prompts import ChatPromptTemplatefrom langchain.chains import SimpleSequentialChain

初始化和链式连接

我们使用温度设置为0.7和API密钥初始化了OpenAI大型语言模型。然后,我们创建了一个具有产品名称占位符的特定聊天提示模板。随后,我们形成了一个LLMChain,它允许根据提供的提示生成回应。我们对两个不同的链重复此过程。

# This is an LLMChain to write first chain.llm = OpenAI(temperature=0.7, openai_api_key=OPENAI_API_KEY)first_prompt = ChatPromptTemplate.from_template(    "What is the best name to describe a company that makes {product}?")chain_one = LLMChain(llm=llm, prompt=first_prompt)

# This is an LLMChain to write second chain.llm = OpenAI(temperature=0.7, openai_api_key=OPENAI_API_KEY)second_prompt = ChatPromptTemplate.from_template(    "Write a 20 words description for the following company:{company_name}")chain_two = LLMChain(llm=llm, prompt=second_prompt)

链接两个链

创建一个总的简单连续链,包括两个不同的个体链,chain_one和chain_two。通过输入“游戏笔记本”执行此操作,它会通过定义的链顺序处理输入并提供输出,显示链的逐步连续执行。

overall_simple_chain = SimpleSequentialChain(chains=[chain_one, chain_two],                                             verbose=True                                            )overall_simple_chain.run("游戏笔记本电脑")

结果:

《在Langchain中使用链条的综合指南》 四海 第8张

Sequential Chain

并不是所有的连续链都只接受一个字符串输入和一个字符串输出。在更加复杂的设置中,这些链接受多个输入并生成多个最终输出。在这些复杂链中,对输入和输出变量的精心命名非常重要。

《在Langchain中使用链条的综合指南》 四海 第9张

连续链的更一般形式允许多个输入/输出。链中的任何一步都可以接受多个输入。

构建链 – 连续链

导入必要的库

from langchain.llms import OpenAIfrom langchain.chains import LLMChainfrom langchain.prompts import PromptTemplatefrom langchain.prompts import ChatPromptTemplatefrom langchain.chains import SequentialChainllm = OpenAI(temperature=0.7, openai_api_key=OPENAI_API_KEY)

初始化和链式处理

我们定义一个提示模板,指导系统执行特定的任务。然后,我们创建一个相应的LLMChain,使用指定的大型语言模型(LLM)和定义的提示模板。该链被设置为接受输入,通过LLM处理输入,并生成输出。我们重复此过程来建立四个不同的链。

Review = "Les ordinateurs portables GamersTech impressionne par ses performances exceptionnelles et son design élégant. De sa configuration  matérielle robuste à un clavier RVB personnalisable et un système de  refroidissement efficace, il établit un équilibre parfait entre prouesses  de jeu et portabilité."# prompt template 1: translate to Englishfirst_prompt = ChatPromptTemplate.from_template(    "将以下评论翻译成英文:"    "\n\n{Review}")# chain 1: input= Review and output= English_Reviewchain_one = LLMChain(llm=llm, prompt=first_prompt,                     output_key="English_Review"                                         )                                       

# prompt template 2: Summarize the English reviewsecond_prompt = ChatPromptTemplate.from_template(    "能否用一句话概括以下评论:"    "\n\n{English_Review}")# chain 2: input= English_Review and output= summarychain_two = LLMChain(llm=llm, prompt=second_prompt,                     output_key="summary"                    )

# prompt template 3: translate to Englishthird_prompt = ChatPromptTemplate.from_template(    "以下评论是什么语言的:\n\n{Review}")# chain 3: input= Review and output= languagechain_three = LLMChain(llm=llm, prompt=third_prompt,                       output_key="language"                      )

# prompt template 4: follow up messagefourth_prompt = ChatPromptTemplate.from_template(    "根据指定的语言,写一个追加回复,回复以下总结:"    "\n\n总结:{summary}\n\n语言:{language}")# chain 4: input= summary, language and output= followup_messagechain_four = LLMChain(llm=llm, prompt=fourth_prompt,                      output_key="followup_message"                     )

链接两个链

创建一个名为’overall_chain’的整体连续链,包含四个单独的链’chain_one’,’chain_two’,’chain_three’和’chain_four’。输入变量“Review”经过这些链的处理,生成三个不同的输出变量:“English_Review”,“summary”和“followup_message”。’overall_chain’通过指定的链执行输入评论,并产生这些输出,提供了一个结构化的、顺序处理的流程,并提供详细输出。

overall_chain = SequentialChain(    chains=[chain_one, chain_two, chain_three, chain_four],    input_variables=["Review"],    output_variables=["English_Review", "summary","followup_message"],    verbose=True)overall_chain(Review)

输出

《在Langchain中使用链条的综合指南》 四海 第10张

路由器链

路由器链用于复杂的任务。如果我们有多个子链,每个子链专门用于特定类型的输入,我们可以有一个路由器链来决定将输入传递给哪个子链。

它由以下组成:

  • 路由器链:负责选择下一个要调用的链。
  • 目标链:路由器链可以路由到的链。
  • 默认链:在路由器无法决定使用哪个子链时使用。

《在Langchain中使用链条的综合指南》 四海 第11张

这涉及根据输入的具体内容将其引导到特定的链条上。当有多个子链,每个子链都专门针对不同的输入类型时,路由器链就发挥作用了。这个路由器链作为决策者,确定要将输入发送到哪个专门的子链。基本上,它实现了将输入无缝路由到适当的子链,根据输入的特定特征进行高效和精确的处理。

设计链 – 路由器链

导入必要的库

from langchain.chains.router import MultiPromptChainfrom langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParserfrom langchain.prompts import PromptTemplatellm = OpenAI(temperature=0.7, openai_api_key=OPENAI_API_KEY)

定义提示模板

让我们考虑这样一个情景:我们需要根据数学、物理、历史或计算机科学等学科将输入引导到专门的链条上。为此,我们为每个学科创建不同的提示模板:一个用于物理问题,另一个用于数学查询,第三个用于历史问题,第四个用于与计算机科学相关的事项。我们精心设计这些提示,以满足每个学科领域的独特需求。

physics_template = """你是一个非常聪明的物理教授。你擅长用简洁易懂的方式回答物理问题。当你不知道某个问题的答案时,你承认自己不知道。\下面是一个问题:{input}"""math_template = """你是一个非常优秀的数学家。你擅长回答数学问题。你之所以这么厉害,是因为你能够将难题分解成组成部分,回答这些组成部分,然后将它们组合起来回答更广泛的问题。\下面是一个问题:{input}"""history_template = """你是一个非常优秀的历史学家。你对各个历史时期的人物、事件和背景有着出色的知识和理解。你有思考、反思、辩论、讨论和评价过去的能力。你尊重历史证据,并能够利用它支持你的解释和判断。\下面是一个问题:{input}"""

此外,还可以将详细信息(包括名称和描述)附加到这些提示模板上。这个额外的上下文提供了对每个模板目的的全面理解。然后将这些信息提供给路由器链。然后,路由器链根据具体学科确定要路由到哪个子链,确保使用适当的提示模板进行精确和有效的响应。

# 定义提示模板信息prompt_infos = [    {        "name": "physics",        "description": "用于回答物理问题",        "prompt_template": physics_template    },    {        "name": "math",        "description": "用于回答数学问题",        "prompt_template": math_template    },    {        "name": "History",        "description": "用于回答历史问题",        "prompt_template": history_template    }]

创建目标链

接下来,我们的重点转向创建目标链。这些链条由RouterChain激活,作为独立的语言模型链条,特别是LLM链条。此外,还规定了默认链路,用于处理路由器遇到模棱两可的情况,无法确定要使用哪个合适的子链。这个默认链路作为回退选项,确保即使在有疑问的情况下也能得到响应。

destination_chains = {}for p_info in prompt_infos:    name = p_info["name"]    prompt_template = p_info["prompt_template"]    prompt = ChatPromptTemplate.from_template(template=prompt_template)    chain = LLMChain(llm=llm, prompt=prompt)    destination_chains[name] = chaindestinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]destinations_str = "\n".join(destinations)

创建多提示路由模板

我们建立了一个模板,指导LLM在各个链之间指导交互。该模板不仅概述了具体的任务指令,还规定了输出应遵循的精确格式,确保了标准化和一致的响应机制。

MULTI_PROMPT_ROUTER_TEMPLATE = """给定原始文本输入到一个语言模型,选择最适合输入的模型提示。您将得到可用提示的名称和描述,以及描述适合该提示的内容。如果您认为修改原始输入将最终导致语言模型回答更好,您还可以修改原始输入。<< 格式化 >>返回一个以JSON对象格式化为下列样式的markdown代码段:```json{{{{    "destination": string \ 用于选择的提示名称或 "DEFAULT"    "next_inputs": string \ 原始输入的潜在修改版本}}}}```请记住:"destination" 必须是下面指定的候选提示名称之一,或者如果输入不适合任何候选提示,它可以是 "DEFAULT"。请记住:"next_inputs" 如果您认为不需要任何修改,则可以只是原始输入。<<候选提示 >>{destinations}<< 输入 >>{{input}}<< 输出(记得包括 ```json) >>"""

创建默认链

建立了一个预设的提示模板,以适应所有类型的输入文本。然后使用指定的大型语言模型和预定义的提示创建了一个名为”default_chain”的关联LLMChain。此设置使得大型语言模型能够根据提供的任何输入文本生成响应。

default_prompt = ChatPromptTemplate.from_template("{input}")default_chain = LLMChain(llm=llm, prompt=default_prompt)

创建路由器模板

在未来,我们开发了一个灵活的路由器模板,涵盖了物理学、数学、历史和计算机科学等多个类别。从这个模板中创建一个专门为路由器定制的独特提示模板。利用这个定制模板,建立了一个路由器链,使用了大型语言模型和相应的路由器提示。

为了提高决策能力,引入了路由器输出解析器。这个解析器帮助路由器链在不同子链之间有效导航。这个全面的安排确保输入准确地定向到特定的子链,从而在各种目标类别中实现准确和针对性的响应。

router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(    destinations=destinations_str)router_prompt = PromptTemplate(    template=router_template,    input_variables=["input"],    output_parser=RouterOutputParser(),)router_chain = LLMRouterChain.from_llm(llm, router_prompt)

将所有部分连接起来

创建一个MultiPromptChain,将路由器链与特定目标链智能地连接起来。此外,还包括一个默认链,用于处理路由器链可能遇到的模棱两可的情况,确保结构化和有效的处理流程,并启用详细日志记录以获取详细的见解。

chain = MultiPromptChain(router_chain=router_chain,                         destination_chains=destination_chains,                         default_chain=default_chain, verbose=True                        )

输出

《在Langchain中使用链条的综合指南》 四海 第12张

Langchain的实际应用案例

深入研究由大型语言模型(LLMs)驱动的解决方案的实际用途和成就,展示它们在各个行业的广泛影响。在客户支持领域,LangChain与LLMs的合作通过智能聊天机器人的实施,改变了服务方式。这些机器人提供即时、个性化的支持,有效处理大量查询。通过缩短等待时间,它们极大地提高了客户满意度。

电子商务

LangChain利用大型语言模型(LLM)的力量来增强购物体验。开发者可以创建能理解产品特点、用户喜好和购买模式的应用程序。通过利用LLM的能力,这些平台能够提供量身定制的产品推荐,解答客户询问,并创造引人入胜的产品描述。这将导致销售额增加和客户参与度提高。

医疗保健

LangChain通过大型语言模型(LLM)驱动的应用程序,正在革新患者护理和诊断。在LangChain的支持下,开发虚拟助手来理解医疗咨询。这些虚拟助手提供准确的信息,根据症状评估患者,并加快医疗知识的获取。这种进展不仅减轻了医疗专业人员的工作负担,还使患者能够对自己的健康做出明智的决策。

内容生成

LangChain赋予开发者能力,创建能产生富有想象力和上下文相关的内容的应用程序,包括博客文章和产品描述。这些应用程序通过提升创造力、简化写作过程和保持风格和语调的一致性来支持内容创作者。

本文中突出的实际应用示例展示了大型语言模型(LLM)驱动解决方案在各个行业中的多样性和影响力。LangChain的潜力使开发者能够创建创新解决方案,简化操作,提高用户参与度和推动业务增长。成功故事层出不穷,从支持票务解决时间显著减少到电子商务聊天机器人的更高客户满意度评级,展示了LLM驱动应用程序的实际好处。

结论

LangChain为开发具有大型语言模型能力的应用程序提供了广阔的机遇领域。无论你关注的是文本完成、语言翻译、情感分析、文本摘要还是命名实体识别等任务,LangChain都是一个多才多艺的解决方案。

LangChain提供了一个全面的框架,通过智能链式技术构建强大的应用程序。通过理解不同链式和它们的配置的复杂性,开发者可以为复杂任务创建定制的解决方案。通过将输入路由到路由链中,增加了智能决策的层次,确保我们将输入引导到最合适的处理路径。有了这些知识,开发者可以设计跨行业的创新应用程序,简化流程,提升用户体验,并最终彻底改变我们在数字领域与语言交互的方式。

关键点

  • LLMChain是LangChain中最简单的链式形式,使用PromptTemplate转化用户输入,为与大型语言模型(LLM)交互的基础和广泛应用的框架。
  • LangChain中的顺序链,无论是简单顺序链还是更复杂的设置,确保一个步骤的输出作为下一个步骤的输入,简化过程,并允许各种应用中的复杂相互作用。
  • LangChain中的路由链作为智能决策者,将特定的输入引导到专门的子链中。这种无缝的路由通过将输入与最合适的处理链匹配,提高了任务的效率。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅由作者酌情使用。

Leave a Reply

Your email address will not be published. Required fields are marked *