在我的用例中,用户选择产品,然后输入查询。我需要运行检索和生成来创建响应。有 3 种不同的产品,每一种都有不同的弹性指数。
一个简单的实现是创建 3 条链:
product A -> chain A = retriever A | prompt | llm
product B -> chain B = retriever B | prompt | llm
product C -> chain C = retriever C | prompt | llm
在推理时,我可以根据产品选择选择正确的链,并通过它运行查询。
但是,我正在尝试探索一种更高级的解决方案,其中检索器之间有一个具有动态路由的单链:
chain D = retriever A/B/C | prompt | llm
我的实现如下所示:
retrievers = {
"product_a": retriever_a,
"product_b": retriever_b,
"product_c": retriever_c
}
def retriever_router(info):
return retrievers[info['product_id']]
chain = RunnableLambda(retriever_router) | prompt | llm
chain.invoke({"question": "Why is it so cold in Antartica",
"product_id": "product_b"})
虽然此代码选择了正确的检索器,但它随后使用“question”和“product_id”字典作为输入来运行检索器。这是一个问题,因为 LangChain 中的检索器希望直接使用查询字符串来调用,而不是使用参数字典(其中查询就是其中之一)来调用。
本质上,我的问题是,使用动态路由时,我需要传递产品 id 来选择正确的检索器,但由于我还传递了一个问题,它使我的输入成为一个字典,而检索器期望一个裸露的字符串输入。
有人知道如何处理这个问题吗?
谢谢!
也许你可以在链之前添加一个选择器来决定使用哪个链。 看来生成动态链更容易了。
就像:
def selector(prompt_dict):
return chain.map()
selector({"question": "Why is it so cold in Antartica",
"product_id": "product_b"})