LangChain中检索器的动态路由

问题描述 投票:0回答:1

在我的用例中,用户选择产品,然后输入查询。我需要运行检索和生成来创建响应。有 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 来选择正确的检索器,但由于我还传递了一个问题,它使我的输入成为一个字典,而检索器期望一个裸露的字符串输入。

有人知道如何处理这个问题吗?

谢谢!

information-retrieval langchain large-language-model
1个回答
0
投票

也许你可以在链之前添加一个选择器来决定使用哪个链。 看来生成动态链更容易了。

就像:

def selector(prompt_dict):
    return chain.map()

selector({"question": "Why is it so cold in Antartica",
              "product_id": "product_b"})
© www.soinside.com 2019 - 2024. All rights reserved.