Я борюсь с базовой цепочкой и передачей входных параметров через RunnableSequences в LangChain v0.2.
У меня есть две цепочки: code_chain и test_chain.
Теперь я хочу соединить их вместе.
Это мой текущий код:
code_prompt = PromptTemplate.from_template("Write a very short {language} function that will {task}");
code_chain = code_prompt | llm | {"code": StrOutputParser()};
test_prompt = PromptTemplate.from_template("Write a test for the following {language} code:\n{code}");
test_chain = test_prompt | llm | {"test": StrOutputParser()};
chain = code_chain | test_chain;
result = chain.invoke({
"language": "python",
"task": "reverse a string",
});
Поскольку code_chain не сохраняет параметр language в качестве вывода, он отсутствует в test_chain:
KeyError: «Во входных данных PromptTemplate отсутствуют переменные {'language'}. Ожидается: ['code', 'language'] Получено: ['code']»
Как передать вход language первой цепочки на вход language второй?





в синтаксисе LCEL
code_chain = code_prompt | llm | {"code": StrOutputParser()};
эта часть {"code": StrOutputParser()} определяет выходной ключ. code_prompt определяет входные переменные. цепочка — это конвейер, вы передаете входные переменные в шаблон приглашения, получая результат от открытого сервера AI в виде словаря с выходными ключами. затем эти выходные ключи передаются во вторую цепочку в качестве входных переменных. ваша вторая цепочка ожидает эти входные переменные: language и code
test_prompt = PromptTemplate.from_template("Write a test for the following {language} code:\n{code}");
но выходные ключи для первой цепочки — это только code, поэтому вам нужно добавить сюда выходной ключ language:
code_chain = code_prompt | llm | {"code": StrOutputParser(),"language": StrOutputParser()};
Оказывается, мой вопрос дублирует вопрос Как включить входы первой цепочки во вторую цепочку в SequentialChain LangChain?.
Чтобы полностью контролировать поток переменных через конвейер, мы можем использовать объекты RunnableParallel:
chain = RunnableParallel({
"language": RunnablePick("language"),
"code": code_chain | RunnablePick("code"),
}) | RunnableParallel({
"language": RunnablePick("language"),
"code": RunnablePick("code"),
"test": test_chain | RunnablePick("test"),
});
Теперь у нас есть все переменные, доступные в выводе: language, code и test.
А что, если нам нужно «поделиться» некоторыми входными данными в последовательной цепочке, есть ли какие-нибудь рецепты? Или мне нужно пропустить через него каждый «элемент» конвейера?
Это не работает, потому что вывод llm — это всего лишь строка. Если я изменю код следующим образом:
code_chain = code_prompt | llm | {"code": StrOutputParser(), "language": StrOutputParser()};Результатом code_chain будет{'code': '\n\ndef add(x, y):\n return x + y', 'language': '\n\ndef add(x, y):\n return x + y'}