构建智能查询分析系统:优化搜索结果的利器

引言

在构建搜索引擎的过程中,一直以来我们都面临着如何高效、准确地从大量数据中检索出用户所需信息的挑战。本文将演示如何构建一个简单的查询分析系统,通过分析用户查询,提升信息检索的准确性。特别是在处理类似自然语言的复杂查询时,查询分析技术变得尤为重要。本文将以LangChain YouTube视频数据集为例,演示如何一步步构建并优化查询系统。

主要内容

1. 环境准备

在开始之前,确保已安装必要的依赖库,并设置环境变量以使用OpenAI API:

# 安装依赖
# %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()  # 设置OpenAI API密钥

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

虽然结果相关性较好,但没有考虑到其他条件(如发布年份)的检索。

代码示例

实现查询分析功能,优化检索结果:

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

class Search(BaseModel):
    query: str = Field(..., description="相似性搜索查询用在视频转录文本上")
    publish_year: Optional[int] = Field(None, description="视频发布年份")

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

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

常见问题和解决方案

问题1:检索结果不符合时间条件。

解决方案:通过查询分析,明确用户查询中的时间限制条件,并在检索时过滤掉不符合的结果。

问题2:API访问不稳定。

解决方案:由于某些地区的网络限制,建议使用API代理服务来提高访问稳定性。

总结与进一步学习资源

通过以上步骤,我们建立了一个能通过查询分析优化检索的系统。更多高级查询分析技术可以探索以下资源:

参考资料

  • LangChain Community Documentation
  • OpenAI API Documentation

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

—END—

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值