构建查询分析系统:一步步实现搜索引擎优化

技术背景介绍

在现代信息 retrieval 系统中,简单的内容检索往往无法满足用户的复杂查询需求。特别是在处理自然语言查询时,直接的字符串匹配可能导致结果不够精确或相关。本次指南将展示如何利用查询分析技术来改进搜索引擎结果。我们将构建一个简单的查询分析系统,通过对 LangChain 的 YouTube 视频进行检索来展示其效果。

核心原理解析

查询分析的核心在于将自然语言查询转换为结构化查询,以便能够根据特定的文档属性进行过滤和精确匹配。在这个示例中,我们将通过定义一个查询模式(query schema),并使用 OpenAI 模型将自然语言查询转换为结构化查询。

代码实现演示

安装依赖

# 安装必要的Python依赖
%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密钥

加载文档

利用 YoutubeLoader 从 YouTube 加载 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")
    )

索引文档

使用向量存储创建文档索引。

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

不使用查询分析的检索

直接对用户问题进行相似性搜索。

search_results = vectorstore.similarity_search("how do I build a RAG agent")
print(search_results[0].metadata["title"])  # 打印检索到的文档标题

使用查询分析进行检索

定义查询模式,转换用户问题到结构化查询。

from typing import Optional
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 模型生成结构化查询。
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are an expert at converting user questions into database queries."),
    ("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):
    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. 完善查询模式:根据具体业务场景,调整查询模式以满足特定需求。
  2. 实验和评估:多次实验不同的模型参数与数据集,评估效果。
  3. 安全管理密钥:使用环境变量或安全的密钥管理系统。

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值