我已经开始与 Langchain 合作来感受它,很多视频似乎已经过时了。经过一些研究,我了解到 LCEL 正在被使用,因为其他方法似乎已被弃用。在我的代码中,我尝试使用一个链的输出作为另一个链的输入,但它似乎不起作用。
def main():
prompt1 = ChatPromptTemplate.from_messages([
('system', "Answer in less than 20 words."),
('human', '{task}')
])
chain1 = prompt1 | model | {'rep1': StrOutputParser()}
prompt2 = ChatPromptTemplate.from_messages([
# ('system', "You're sleepy."),
('human', 'Translate {rep1} to {lang}'),
])
datamap = {
'lang': RunnablePassthrough(),
'rep1': RunnablePassthrough(),
}
chain2 = datamap | prompt2 | model | {'rep2': StrOutputParser()}
allchain = chain1 | chain2
response = allchain.invoke({
'task': 'Good morning',
'lang': 'french'
})
print(response)
我得到的结果是
response: {'rep2': "{'rep1': 'Good morning! How can I help you today?'}"}
我立即写下了这个,所以我明白如果它没有以任何方式优化,但我也很想知道这将如何在生产中完成。
正在正确的轨道上使用 LCEL 在 LangChain 中链接链!问题在于正在使用
RunnablePassthrough
将
rep1
传递给第二条链,这意味着它不会被评估,而只是按原样传递。
以下是解决该问题的修改后的代码以及说明:
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain, SequentialChain
from langchain.schema import StrOutputParser
def main():
# 第一链:获取简短回复
prompt1 = ChatPromptTemplate.from_messages([
("system", "Answer in less than 20 words."),
("human", "{task}")
])
chain1 = LLMChain(llm=ChatOpenAI(temperature=0), prompt=prompt1, output_parser=StrOutputParser())
# 第二链:翻译回复
prompt2 = ChatPromptTemplate.from_messages([
("human", "Translate {rep1} to {lang}")
])
chain2 = LLMChain(llm=ChatOpenAI(temperature=0), prompt=prompt2, output_parser=StrOutputParser())
# 使用 SequentialChain 将两个链条连接在一起
allchain = SequentialChain(
chains=[chain1, chain2],
input_variables=["task", "lang"],
output_variables=["rep2"]
)
# 运行链条
response = allchain({"task": "Good morning", "lang": "french"})
print(response)
if __name__ == "__main__":
main()
说明:
-
使用
SequentialChain
: 我们不再需要手动创建数据映射。SequentialChain
可以很好地处理链之间的输入/输出传递。 -
定义
input_variables
和output_variables
: 我们明确告诉SequentialChain
哪些变量是输入,哪些是最终输出。 -
直接访问
rep2
: 由于我们已在SequentialChain
中定义了output_variables
,因此我们可以直接从响应中访问rep2
。
此代码将按预期工作,并打印出“Good morning”的法语翻译。
关于生产环境:
提供的代码是一个很好的起点,但在将其用于生产环境之前,需要考虑一些事项:
- 错误处理: 需要添加错误处理机制以捕获链条中可能发生的任何错误。
- 日志记录: 为了调试和监控,记录链条的输入、输出和任何错误非常重要。
- 缓存: 如果多次调用具有相同输入的链条,则缓存响应以提高性能和降低成本可能会有所帮助。
- 模型选择: 仔细选择的模型并考虑性能、成本和用例要求。
LangChain 提供了许多工具和集成,可以帮助解决这些生产环境问题。有关更多信息,请参阅 LangChain 文档: https://python.langchain.com/
标签:python,langchain,py-langchain From: 78776870