打造智能查询分析系统:从零开始构建你的智能搜索引擎

112 阅读3分钟

打造智能查询分析系统:从零开始构建你的智能搜索引擎

引言

在现代 AI 驱动的应用中,查询分析系统扮演着至关重要的角色。无论是知识检索、智能助手,还是聊天机器人,它们都利用强大的查询分析功能来提升用户体验。本篇文章将带你通过一个实际的端到端示例,理解如何通过查询分析来优化搜索引擎的功能。我们将会创建一个简单的搜索引擎,展示直接传递用户问题给检索系统时可能出现的问题,以及如何通过查询分析来解决这些问题。本篇将仅涵盖其中的一种方法。

主要内容

1. 环境准备

首先,我们需要安装所需的库:

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

设置环境变量以使用 OpenAI:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()  # 输入您的 OpenAI 密钥

2. 加载文档

我们将使用 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())

3. 文档索引

为了进行检索,我们需要对文档进行索引。我们将使用一个向量存储,并在创建向量之前对文档进行分块:

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

# 使用API代理服务提高访问稳定性

4. 查询分析

我们通过定义查询模式,使用 OpenAI 的功能调用 API 来将用户问题转化为结构化查询。如下所示:

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

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

接下来,通过 OpenAI 生成结构化查询:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
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": RunnablePassthrough()} | prompt | structured_llm

# 使用API代理服务提高访问稳定性

5. 检索

通过分析后的查询进行检索:

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")
[(doc.metadata["title"], doc.metadata["publish_date"]) for doc in results]

常见问题和解决方案

  • 检索结果不准确:这可能由于索引没有创建好或者查询没有正确解析。确保文档分块和查询结构化步骤正确完成。
  • 网络访问限制:某些地区可能无法直接访问 OpenAI API,建议使用 API 代理服务来提高访问稳定性。

总结和进一步学习资源

通过本文,你了解了如何建立一个基本的查询分析系统来优化搜索引擎的功能。如果你希望深入了解更多的查询分析技术,可以参考以下资源:

参考资料

  • LangChain团队的开源项目和相关文档
  • OpenAI API文档

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

---END---