合成高级组件
本节包含将其他任意系统(例如外部API和服务)和/或LangChain基元件组合在一起的高级组件。
阅读LangChain表达语言部分,并熟悉通过管道构建序列和提供的各种基元素将是本节的良好入门。
本节涵盖的组件有:
工具
工具提供了LLMs和其他组件与其他系统交互的接口。示例包括维基百科,计算器和Python REPL。
代理
代理使用语言模型来决定采取的行动,通常由工具定义。它们需要一个executor
,即代理的运行时。executor实际上调用代理,执行它选择的工具,将动作输出传回代理,并重复这个过程。代理负责解析先前结果的输出并选择下一步。
链
构建其他基元素和组件的积木风格合成。 # Composition
LangChain提供了一个用户友好的界面,用于将不同部分的提示组合在一起。您可以使用字符串提示或聊天提示进行此操作。以这种方式构建提示可以轻松重用组件。
字符串提示的组合
在使用字符串提示时,每个模板都被连接在一起。您可以直接使用提示或字符串(列表中的第一个元素必须是提示)。
from langchain.prompts import PromptTemplate
prompt = (
PromptTemplate.from_template("告诉我一个关于 {topic} 的笑话")
+ ",搞笑点"
+ "\n\n以及用 {language} 说"
)
prompt
prompt.format(topic="体育", language="西班牙语")
您也可以像以前一样在LLMChain中使用它。
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI
model = ChatOpenAI()
chain = LLMChain(llm=model, prompt=prompt)
chain.run(topic="体育", language="西班牙语")
聊天提示的组合
聊天提示由一系列消息组成。出于开发者体验考虑,我们提供了一种方便的方法来创建这些提示。在此管道中,每个新元素都是最终提示中的新消息。
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
首先,让我们使用系统消息初始化基本的ChatPromptTemplate。它不一定要以系统开始,但通常是一个好习惯。
prompt = SystemMessage(content="你是一个很好的海盗")
然后,您可以轻松地创建一个包含其他消息或消息模板的管道。当没有要格式化的变量时,请使用Message
,当有要格式化的变量时,请使用MessageTemplate
。您也可以只使用一个字符串(注:这将自动推断为HumanMessagePromptTemplate)。
new_prompt = (
prompt + HumanMessage(content="嗨") + AIMessage(content="什么?") + "{input}"
在后台,这将创建一个ChatPromptTemplate类的实例,因此您可以像以前一样使用!
new_prompt.format_messages(input="我说了嗨")
您也可以像以前一样在LLMChain中使用它。
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI
model = ChatOpenAI()
chain = LLMChain(llm=model, prompt=new_prompt)
chain.run("我说了嗨")
使用PipelinePrompt
LangChain包括一个抽象【PipelinePromptTemplate】,在您想要重用提示的部分时可能很有用。PipelinePrompt由两个主要部分组成:
- 最终提示:返回的最终提示
- 管道提示:一个元组列表,包含一个字符串名称和一个提示模板。每个提示模板将被格式化,然后作为具有相同名称的变量传递给未来的提示模板。
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts.prompt import PromptTemplate
full_template = """{介绍}
{示例}
{开始}"""
full_prompt = PromptTemplate.from_template(full_template)
introduction_template = """您正在模仿 {person}。"""
introduction_prompt = PromptTemplate.from_template(introduction_template)
example_template = """这是一个互动的示例:
Q:{example_q}
A:{example_a}"""
example_prompt = PromptTemplate.from_template(example_template)
start_template = """现在,真正做到这一点!
Q:{input}
A:"""
start_prompt = PromptTemplate.from_template(start_template)
``````python
input_prompts = [
("介绍", introduction_prompt),
("示例", example_prompt),
("开始", start_prompt),
]
pipeline_prompt = PipelinePromptTemplate(
final_prompt=full_prompt, pipeline_prompts=input_prompts
)
pipeline_prompt.input_variables
['example_q', 'person', 'input', 'example_a']
print(
pipeline_prompt.format(
person="Elon Musk",
example_q="你最喜欢的汽车是什么?",
example_a="特斯拉",
input="你最喜欢的社交媒体网站是什么?",
)
)
你正在冒充埃隆·马斯克。
以下是一个交互示例:
问:你最喜欢的汽车是什么?
答:特斯拉
现在,来做真实的事情!
问:你最喜欢的社交媒体网站是什么?
答: