提示 + LLM
最常见和有价值的组合是:
PromptTemplate
/ ChatPromptTemplate
-> LLM
/ ChatModel
-> OutputParser
几乎任何其他链都会使用这个构建块。
PromptTemplate + LLM
最简单的组合只是将提示和模型组合在一起,创建一个链,接受用户输入,将其添加到提示中,传递给模型,并返回原始模型输出。
注意,您可以在这里随意混合和匹配PromptTemplate/ChatPromptTemplates和LLMs/ChatModels。 %pip install --upgrade --quiet langchain langchain-openai
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template("tell me a joke about {foo}")
model = ChatOpenAI()
chain = prompt | model
chain.invoke({"foo": "bears"})
AIMessage(content="为什么熊不穿鞋子?\n\n因为它们有熊脚!", additional_kwargs={}, example=False)
通常我们希望附加传递给每个模型调用的kwargs。以下是一些示例:
附加停止序列
chain = prompt | model.bind(stop=["\n"])
chain.invoke({"foo": "bears"})
AIMessage(content='为什么熊从不穿鞋?', additional_kwargs={}, example=False)
附加函数调用信息
functions = [
{
"name": "joke",
"description": "一个笑话",
"parameters": {
"type": "object",
"properties": {
"setup": {"type": "string", "description": "笑话的开头"},
"punchline": {
"type": "string",
"description": "笑话的结尾",
},
},
"required": ["setup", "punchline"],
},
}
]
chain = prompt | model.bind(function_call={"name": "joke"}, functions=functions)
chain.invoke({"foo": "bears"}, config={})
AIMessage(content='', additional_kwargs={'function_call': {'name': 'joke', 'arguments': '{\n "setup": "为什么熊不穿鞋子?",\n "punchline": "因为它们有熊脚!"\n}'}}, example=False)
PromptTemplate + LLM + OutputParser
我们还可以添加一个输出解析器,将原始的LLM/ChatModel输出轻松转换为更可操作的格式
from langchain_core.output_parsers import StrOutputParser
chain = prompt | model | StrOutputParser()
注意,现在返回的是一个字符串 - 对于下游任务来说,这是一个更可操作的格式
chain.invoke({"foo": "bears"})
"为什么熊不穿鞋子?\n\n因为它们有熊脚!"
函数输出解析器
当您指定要返回的函数时,您可能只想直接解析它
from langchain.output_parsers.openai_functions import JsonOutputFunctionsParser
chain = (
prompt
| model.bind(function_call={"name": "joke"}, functions=functions)
| JsonOutputFunctionsParser()
)
chain.invoke({"foo": "bears"})
{'setup': "为什么熊不喜欢快餐?",
'punchline': "因为它们抓不到它!"}
from langchain.output_parsers.openai_functions import JsonKeyOutputFunctionsParser
chain = (
prompt
| model.bind(function_call={"name": "joke"}, functions=functions)
| JsonKeyOutputFunctionsParser(key_name="setup")
)
chain.invoke({"foo": "bears"})
"为什么熊不穿鞋子?"
简化输入
为了使调用更简单,我们可以添加一个RunnableParallel
来为我们创建提示输入字典:
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
map_ = RunnableParallel(foo=RunnablePassthrough())
chain = (
map_
| prompt
| model.bind(function_call={"name": "joke"}, functions=functions)
| JsonKeyOutputFunctionsParser(key_name="setup")
)
chain.invoke("bears")
"为什么熊不穿鞋子?"
由于我们将我们的映射与另一个Runnable组合在一起,我们甚至可以使用一些语法糖,只需使用一个字典:
chain = (
{"foo": RunnablePassthrough()}
| prompt
| model.bind(function_call={"name": "joke"}, functions=functions)
| JsonKeyOutputFunctionsParser(key_name="setup")
)
chain.invoke("bears")
"为什么熊不喜欢快餐?"