构建一个查询分析系统

技术背景介绍

在构建一个查询分析系统时,需要能够加载文档、使用聊天模型、生成嵌入、创建向量存储并执行检索。这些过程的目标是将用户输入的查询优化,以实现更为精准的检索结果。

本文将通过一个端到端的示例展示如何使用查询分析提升检索结果的相关性。我们将着眼于如何对LangChain的YouTube视频进行检索,并通过查询分析解决原始用户问题直接传递给搜索引擎时可能出现的失败模式。

核心原理解析

查询分析的核心在于将用户的自然语言问题转换为更结构化的查询,从而更好地匹配待检索的文档。这通常涉及对查询进行解析,提取关键字,甚至应用时间过滤等高级特性。

代码实现演示

以下是完整的代码实现,通过它可以体验如何构建查询分析系统。

# 安装依赖
# %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()

# 加载文档
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,
)

# 执行查询分析
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    query: str = Field(..., description="Similarity search query.")
    publish_year: Optional[int] = Field(None, description="Year video was published")

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 系统提示语设置
system = """You are an expert at converting user questions into database queries. \
You have access to a database of tutorial videos about a software library for building LLM-powered applications. \
Given a question, return a list of database queries optimized to retrieve the most relevant results.

If there are acronyms or words you are not familiar with, do not try to rephrase them."""
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

# 检索功能实现
from typing import List
from langchain_core.documents import Document

def retrieval(search: Search) -> List[Document]:
    _filter = {"publish_year": {"$eq": search.publish_year}} if search.publish_year is not None else None
    return vectorstore.similarity_search(search.query, filter=_filter)

retrieval_chain = query_analyzer | retrieval

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

应用场景分析

这个查询分析系统可以广泛应用于需要高效信息检索的场景,如视频内容管理、教育资源查询以及公开数据集的检索等。通过优化用户查询,系统能够快速响应并返回最相关的信息,从而提升用户体验和检索效率。

实践建议

  1. 多维度分析:基于用户的上下文和查询意图,尽可能详尽地解析和构建用户查询。
  2. 持续优化:通过用户反馈持续改进查询模型和文档索引策略,以提高检索准确性。
  3. 安全配置:确保API密钥和其他机密信息的安全性,建议使用环境变量进行管理。

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

—END—

你可能感兴趣的:(数据库,python)