6大核心模块(Modules)
入门(Getting Started)

LangChain

开始

在本教程中,我们将学习如何在 LangChain 创建简单的连锁店。我们将学习如何创建一个链,向其添加组件,并运行它。

在本教程中,我们将介绍:

  • 使用简单的 LLM 链
  • 创建连续链
  • 创建定制链

为什么我们需要锁链?

链允许我们将多个组件组合在一起,创建一个单一的、一致的应用程序。例如,我们可以创建一个链,该链接接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化后的响应传递给 LLM。我们可以通过将多个链组合在一起,或者通过将链与其他组件组合在一起,来构建更复杂的链。

快速开始: 使用LLMChain

LLMChain 是一个简单的链,它接受一个提示模板,使用用户输入对其进行格式化,并从 LLM 返回响应。

要使用 LLMChain,首先创建一个提示模板。

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
 
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
 

现在我们可以创建一个非常简单的链,它将接受用户输入,用它格式化提示符,然后将其发送到 LLM。

from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
 
# Run the chain only specifying the input variable.
print(chain.run("colorful socks"))
 
SockSplash!
 

你也可以在 LLMChain 中使用聊天模型:

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
)
human_message_prompt = HumanMessagePromptTemplate(
        prompt=PromptTemplate(
            template="What is a good name for a company that makes {product}?",
            input_variables=["product"],
        )
    )
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
chat = ChatOpenAI(temperature=0.9)
chain = LLMChain(llm=chat, prompt=chat_prompt_template)
print(chain.run("colorful socks"))
 
Rainbow Sox Co.
 

调用链的不同方式

从 Chain 继承的所有类都提供了一些运行链逻辑的方法。最直接的方法是使用 __call__ :

chat = ChatOpenAI(temperature=0)
prompt_template = "Tell me a {adjective} joke"
llm_chain = LLMChain(
    llm=chat,
    prompt=PromptTemplate.from_template(prompt_template)
)
 
llm_chain(inputs={"adjective":"corny"})
 
{'adjective': 'corny',
 'text': 'Why did the tomato turn red? Because it saw the salad dressing!'}
 

默认情况下,_ _ call _ _ 返回输入和输出键值。通过将 return _ only _ output 设置为True,可以将其配置为只返回输出键值。

llm_chain("corny", return_only_outputs=True)
 
{'text': 'Why did the tomato turn red? Because it saw the salad dressing!'}
 

如果 Chain 只输出一个输出键(即在 output _ key 中只有一个元素) ,则可以使用 run 方法。注意 run 输出的是字符串而不是字典。

# llm_chain only has one output key, so we can use run
llm_chain.output_keys
 
['text']
 
llm_chain.run({"adjective":"corny"})
 
'Why did the tomato turn red? Because it saw the salad dressing!'
 

对于一个输入键,您可以直接输入字符串,而无需指定输入映射。

# These two are equivalent
llm_chain.run({"adjective":"corny"})
llm_chain.run("corny")
 
# These two are also equivalent
llm_chain("corny")
llm_chain({"adjective":"corny"})
 
{'adjective': 'corny',
 'text': 'Why did the tomato turn red? Because it saw the salad dressing!'}
 

提示: 您可以通过 run 方法轻松地将 Chain 对象作为工具集成到您的 Agent 中。这里有一个例子。 here .

向链中添加内存

Chain 支持将 BaseMemory 对象作为其内存参数,允许 Chain 对象跨多个调用持久存储数据。换句话说,它使 Chain 成为一个有状态对象。

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
 
conversation = ConversationChain(
    llm=chat,
    memory=ConversationBufferMemory()
)
 
conversation.run("Answer briefly. What are the first 3 colors of a rainbow?")
# -> The first three colors of a rainbow are red, orange, and yellow.
conversation.run("And the next 4?")
# -> The next four colors of a rainbow are green, blue, indigo, and violet.
 
'The next four colors of a rainbow are green, blue, indigo, and violet.'
 

实际上,BaseMemory 定义了一个长链存储内存的接口。它允许通过 load _ memory _ variable 方法读取存储的数据,并通过 save _ context 方法存储新数据。你可以在内存部分了解更多。 Memory

调试链

因为大多数 Chain 对象都涉及大量的输入提示预处理和 LLM 输出后处理,所以很难单独从它的输出调试 Chain 对象。如果详细设置为 True,将在 Chain 对象运行时打印出它的一些内部状态。

conversation = ConversationChain(
    llm=chat,
    memory=ConversationBufferMemory(),
    verbose=True
)
conversation.run("What is ChatGPT?")
 
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
 
Current conversation:
 
Human: What is ChatGPT?
AI:
 
> Finished chain.
 
'ChatGPT is an AI language model developed by OpenAI. It is based on the GPT-3 architecture and is capable of generating human-like responses to text prompts. ChatGPT has been trained on a massive amount of text data and can understand and respond to a wide range of topics. It is often used for chatbots, virtual assistants, and other conversational AI applications.'
 

Combine chains with the SequentialChain

调用语言模型之后的下一步是对语言模型进行一系列调用。我们可以使用序列链来实现这一点,序列链是按照预定义的顺序执行链接的链。具体来说,我们将使用 SimpleSequentialChain。这是最简单的顺序链类型,其中每个步骤都有一个输入/输出,一个步骤的输出是下一个步骤的输入。

在本教程中,我们的顺序链将:

首先,为产品创建一个公司名称。我们将重用之前初始化的 LLMChain 来创建这个公司名称。

然后,为产品创建一个口号。我们将初始化一个新的 LLMChain 来创建这个口号,如下所示。

second_prompt = PromptTemplate(
    input_variables=["company_name"],
    template="Write a catchphrase for the following company: {company_name}",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
 

现在我们可以组合这两个 LLMChains,这样我们就可以在一个步骤中创建一个公司名称和一个口号。

from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
 
# Run the chain specifying only the input variable for the first chain.
catchphrase = overall_chain.run("colorful socks")
print(catchphrase)
 
> Entering new SimpleSequentialChain chain...
Rainbow Socks Co.
 
 
"Step into Color with Rainbow Socks!"
 
> Finished chain.
 
 
"Step into Color with Rainbow Socks!"
 

类创建自定义链Chain

LangChain 提供了很多现成的链接,但是有时候您可能想要为您的特定用例创建一个自定义链接。对于此示例,我们将创建一个自定义链,用于连接2个 LLMChains 的输出。

为了创建自定义链:

首先从 Chain 类的子类化开始,

填写 input _ key 和 output _ key 属性,

添加显示如何执行链的 _ call 方法。

下面的例子说明了这些步骤:

from langchain.chains import LLMChain
from langchain.chains.base import Chain
 
from typing import Dict, List
 
 
class ConcatenateChain(Chain):
    chain_1: LLMChain
    chain_2: LLMChain
 
    @property
    def input_keys(self) -> List[str]:
        # Union of the input keys of the two chains.
        all_input_vars = set(self.chain_1.input_keys).union(set(self.chain_2.input_keys))
        return list(all_input_vars)
 
    @property
    def output_keys(self) -> List[str]:
        return ['concat_output']
 
    def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:
        output_1 = self.chain_1.run(inputs)
        output_2 = self.chain_2.run(inputs)
        return {'concat_output': output_1 + output_2}
 

就是这样! 想了解更多关于如何使用链条做一些很酷的事情的细节,请查看链条使用指南。

prompt_1 = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
chain_1 = LLMChain(llm=llm, prompt=prompt_1)
 
prompt_2 = PromptTemplate(
    input_variables=["product"],
    template="What is a good slogan for a company that makes {product}?",
)
chain_2 = LLMChain(llm=llm, prompt=prompt_2)
 
concat_chain = ConcatenateChain(chain_1=chain_1, chain_2=chain_2)
concat_output = concat_chain.run("colorful socks")
print(f"Concatenated output:\n{concat_output}")
 
Concatenated output:
 
 
Socktastic Colors.
 
"Put Some Color in Your Step!"
 

That’s it! For more details about how to do cool things with Chains, check out the how-to guide for chains.