LangChain快速入门
构建应用程序
LangChain应用程序的核心构建模块是LLMChain。
- LLM:语言模型是核心推理引擎。要使用LangChain,需要了解不同类型的语言模型以及如何使用它们。
- Prompt Templates:提供语言模型的指令,控制了语言模型的输出,因此了解如何构建提示和不同的提示策略至关重要。
- Output Parsers:将LLM的原始响应转换为更易处理的格式,使得在下游使用输出变得更容易。
LLMs & ChatModels
LangChain有两种类型的语言模型
- LLMs:以字符串作为输入并返回字符串的语言模型
- ChatModels:以消息列表作为输入并返回消息的语言模型
LLMs的输入输出就是字符串,而ChatModels的输入是一个ChatMessage
列表,输出是一个单独的ChatMessage
。
一个ChatMessage
具有两个必需的组件:
content
:消息的内容role
:ChatMessage
来自的实体的角色
LangChain提供了几个对象,用于方便地区区分不同的角色:
HumanMessage
: 来自人类/用户的ChatMessage
。AIMessage
: 来自AI/助手的ChatMessage
。SystemMessage
: 来自系统的ChatMessage
。FunctionMessage
: 来自函数调用的ChatMessage
。
还可以使用ChatMessage
类手动指定角色。
LangChain为两者提供了一个标准接口,但对于两者之间仍然具有差异。
LangChain提供的标准接口有两种方法:
predict
: 接受一个字符串,返回一个字符串predict_messages
: 接受一个消息列表,返回一个消息。
提示模板
大多数LLM应用程序不会直接将用户输入传递到LLM中。通常,它们会将用户输入添加到一个更大的文本片段中,称为提示模板,该模板提供了有关特定任务的附加上下文。
PromptTemplates正是为此而设计的,它们将用户输入转化为完全格式化的提示的所有逻辑绑定在一起。
例如:
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")
prompt.format(product="colorful socks")
输出得到:What is a good name for a company that makes colorful socks?
其优势是,可以“部分”出变量,即一次格式化某些变量,将它们组合在一起,将不同的模板组合成一个单独的提示。
PromptTemplates还可以用于生成消息列表。在这种情况下,提示不仅包含有关内容的信息,还包含每个消息(其角色、其在列表中的位置等) 在这里,最常见的是ChatPromptTemplate是ChatMessageTemplate的列表。每个ChatMessageTemplate包含了格式化该ChatMessage的指令 - 其角色,以及其内容。
例如:
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")
输出:
[SystemMessage(content='You are a helpful assistant that translates English to French.'),
HumanMessage(content='I love programming.')]
输出解析器
OutputParsers将LLM的原始输出转换为可以在下游使用的格式。输出解析器有几种主要类型,包括:
- 将LLM的文本转换为结构化信息(例如JSON)
- 将ChatMessage转换为字符串
- 将除消息之外的其他信息(如OpenAI函数调用)转换为字符串。
LLMChain
将所有这些组合成一个链组件,这个链组件将接收输入变量,将其传递给提示模板以创建提示,将提示传递给LLM,然后通过一个输出解析器将输出传递出去。
from langchain_openai import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.schema import BaseOutputParser
class CommaSeparatedListOutputParser(BaseOutputParser):
"""将 LLM 调用的输出解析为逗号分隔的列表。"""
def parse(self, text: str):
"""解析 LLM 调用的输出。"""
return text.strip().split(", ")
template = "您是一位有用的助手,可以生成逗号分隔的列表。用户将传入一个类别,您应该在该类别中生成 5 个对象,并以逗号分隔列表形式。仅返回逗号分隔的列表,仅此而已。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(
llm = ChatOpenAI(),
prompt=chat_prompt,
output_parser=CommaSeparatedListOutputParser()
)
chain.run("colors")
输出:
['red', 'blue', 'green', 'yellow', 'orange']