首页 > 数据库 >使用 Upstash 构建无服务器向量数据库与缓存系统的最佳实践

使用 Upstash 构建无服务器向量数据库与缓存系统的最佳实践

时间:2025-01-13 19:59:04浏览次数:3  
标签:存储 缓存 redis Redis 服务器 Upstash 向量

技术背景介绍

在构建现代智能应用时,开发者经常需要处理大量数据,包括向量嵌入、缓存管理和消息存储。然而传统数据库和内存存储的部署和运维往往带来复杂性。为了简化这些挑战,Upstash 提供了基于 HTTP 的无服务器数据库和消息队列,其中包含两大关键产品:

  1. Upstash Vector —— 用于管理向量嵌入的无服务器数据库。
  2. Upstash Redis —— 用作缓存与内存存储。

这些数据库支持 HTTP 协议,使其能够在无服务器平台(如 AWS Lambda、边缘计算环境等)中运行,而无需依赖传统的 TCP 连接。

本文将详细讲解如何通过 Upstash 开发强大的 LangChain 应用,包括向量存储与查询、缓存使用等场景。


核心原理解析

Upstash Vector

Upstash Vector 是一个支持向量嵌入存储与查询的无服务器数据库。它允许开发者存储高维向量,并快速进行相似性搜索。其核心功能包括:

  1. 向量插入与批量存储。
  2. 基于文本或向量的相似性搜索。
  3. 命名空间(namespace)用于数据分区。
  4. 支持基于 HTTP 的嵌入操作。

Upstash Redis

Upstash Redis 是 Redis 的无服务器实现,适用于以下场景:

  1. 低延迟缓存(如缓存 LLM 的输入/输出)。
  2. 聊天消息历史的存储,支持对话记忆。
  3. 高并发访问的全球分布式数据库。

代码实现演示

环境配置

在开始之前,请在 Upstash 控制台创建账户,并获取相应的 REST URL 和令牌。在代码中设置这些环境变量以确保安全。

import os

os.environ["UPSTASH_VECTOR_REST_URL"] = "https://example.upstash.io"
os.environ["UPSTASH_VECTOR_REST_TOKEN"] = "your-upstash-token"
os.environ["UPSTASH_REDIS_REST_URL"] = "https://redis-example.upstash.io"
os.environ["UPSTASH_REDIS_REST_TOKEN"] = "your-redis-token"

Upstash Vector 的实践

1. 安装 SDK

首先安装必要的 Python SDK:

pip install upstash-vector langchain
2. 创建向量存储对象

以下代码展示如何初始化一个 Upstash Vector 存储对象,并使用 OpenAI 嵌入模型生成向量。

from langchain_community.vectorstores.upstash import UpstashVectorStore
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings

# 加载文本数据
loader = TextLoader("state_of_the_union.txt")
documents = loader.load()

# 分割文档为小段落
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 初始化 OpenAI 嵌入
embeddings = OpenAIEmbeddings()

# 创建 Upstash Vector 存储对象
store = UpstashVectorStore(embedding=embeddings)

# 插入文档的嵌入向量
store.add_documents(docs)
3. 查询向量

对向量的查询可以基于文本或向量:

# 基于文本的相似性搜索
result = store.similarity_search(
    "The United States of America",
    k=5  # 返回前 5 个匹配
)
print(result)

# 基于向量的相似性搜索
query_vector = embeddings.embed_query("Global economics")
result = store.similarity_search_by_vector(query_vector, k=5)
print(result)
4. 命名空间管理

使用命名空间将数据进行逻辑分区,适合大规模数据管理:

store_with_namespace = UpstashVectorStore(
    embedding=embeddings,
    namespace="economic_reports"
)

Upstash Redis 的实践

1. 安装 SDK

安装 Redis SDK:

pip install upstash-redis
2. 配置缓存

将 Upstash Redis 集成到 LangChain 缓存中,用于存储 LLM 请求与响应的结果:

from langchain.cache import UpstashRedisCache
from upstash_redis import Redis

redis_client = Redis(
    url=os.getenv("UPSTASH_REDIS_REST_URL"),
    token=os.getenv("UPSTASH_REDIS_REST_TOKEN")
)

# 设置 LLM 缓存
from langchain.llm_cache import UpstashRedisCache
langchain.llm_cache = UpstashRedisCache(redis_=redis_client)
3. 对话记忆管理

使用 Upstash Redis 存储聊天消息历史:

from langchain_community.chat_message_histories import UpstashRedisChatMessageHistory

# 初始化聊天消息历史存储
message_history = UpstashRedisChatMessageHistory(
    redis_=redis_client,
    session_id="user-session-1"
)

# 保存对话历史
message_history.add_message({"role": "user", "content": "Hello AI!"})
message_history.add_message({"role": "assistant", "content": "Hello User!"})

# 获取对话历史
print(message_history.messages)

应用场景分析

  1. AI 搜索引擎:结合 Upstash Vector 构建支持语义查询的搜索引擎。
  2. 实时对话系统:通过 Upstash Redis 存储对话历史,实现上下文记忆。
  3. 边缘推理应用:基于 Upstash 的 HTTP 支持,可以轻松部署在 AWS Lambda 等无服务器平台。

实践建议

  1. 优化批量插入:在插入大规模向量时,使用 batch_size 参数控制请求批量大小,以提升性能。
  2. 使用命名空间:为不同类别的数据设置单独的命名空间,便于分区管理和加速查询。
  3. 缓存 LLM 结果:使用 Upstash Redis 减少重复计算,降低延迟与成本。

通过本文,你可以轻松在 LangChain 中集成 Upstash 提供的服务,构建高效、可扩展的 AI 应用。如果遇到问题欢迎在评论区交流。

—END—

标签:存储,缓存,redis,Redis,服务器,Upstash,向量
From: https://blog.csdn.net/safHTEAHE/article/details/145069224

相关文章

  • linux服务器: Shell文件,注释,变量
    Shell文件Shell是一个用户跟操作系统之间的一个命令解释器创建shell文件编写内容#!/bin/bash:这是一个shebang行,告诉系统这个脚本应该使用bashshell来执行。#是一个注释字符,用于说明这行的作用。echo命令,用于在终端输出文本执行脚本1.给文件执行......
  • JavaScript与服务器端框架Flask
    JavaScript与服务器端框架Flask基本概念和作用说明示例一:设置基本的Flask环境示例二:使用JavaScript发起请求功能使用思路及代码示例示例三:处理POST请求示例四:表单验证与反馈开发经验分享在现代Web开发中,前端和后端的紧密结合对于创建高效、响应迅速的应用程序至关......
  • 《深入理解Mybatis原理》Mybatis中的缓存实现原理
    一级缓存实现什么是一级缓存?为什么使用一级缓存?每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据......
  • 如何解决Webview和H5缓存问题,确保每次加载最新版本的资源
    WebView用于加载H5页面是常见的做法,它能够加载远程的HTML、CSS、JavaScript资源,并且让Web应用嵌入到原生App中。然而,WebView的缓存机制有时会导致用户看到的是旧版本的页面或资源,尤其是在H5发版后,iOS端用户可能仍然加载到缓存的旧页面,造成了不一致的体验。本篇文......
  • websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库
    推荐一个C#开发的,实现WebSocket功能的开源项目。01项目简介websocket-sharp提供WebSocket客户端和服务器库,基于C#开发的,并遵循WebSocket协议规范,使得开发人员能够轻松地在.NET应用程序中实现WebSocket通信。websocket-sharp特色功能有:1、简洁易用的API:提供清晰且......
  • go语言:实现lfu cache缓存算法(附完整源码)
    go语言:实现lfucache缓存算法代码说明使用示例在Go语言中实现LFU(LeastFrequentlyUsed)缓存算法可以通过使用一个映射来存储缓存项和它们的频率计数,同时维护一个最小频率的链表以便快速访问。下面是一个完整的LFUCache的实现示例:packagemainimport......
  • Spring中三级缓存详细讲解
    1、Spring三级缓存是什么,过程是怎么样的?Spring中的三级缓存主要用于单例Bean的生命周期管理,特别是在循环依赖时,它通过不同阶段暴露Bean实例来确保依赖注入的顺利完成。缓存的内容如下:一级缓存(singletonObjects):存储完全初始化的单例Bean。该缓存中存储的是已经完......
  • Kafka 是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时
    Kafka集群是什么?Kafka是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时数据流。Kafka集群是由多个Kafka服务器(称为Broker)组成的,它们共同工作以实现消息的高可用性、可靠性、可扩展性和容错性。Kafka集群的目的是确保消息的持久化和高效传输,同......
  • Redis 是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。
    Redis服务器是什么?Redis是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合、位图等。它被广泛用于需要快速读写操作、低延迟的场景。Redis可以作为一个独立的数据库使用,也可以作为缓......
  • 服务器组件端口开通方法及注意事项
    开通服务器组件端口是确保服务正常运行的关键步骤之一。无论是操作系统层面还是通过管理工具如宝塔面板,都需要遵循一定的流程来确保端口能够正确开放,并且不会带来安全隐患。以下是详细的开通方法和注意事项:操作系统层面开通端口:Windows服务器:打开“高级安全Windows防火墙”......