在缓存中查询和使用向量数据

举报
码乐 发表于 2025/11/18 12:03:23 2025/11/18
【摘要】 1 简介在 Redis 的最新版本中(Redis 7.x),包括了对向量数据和图片数据的支持,尤其是在 RediSearch 和 RedisAI 模块中。具体来说:Redis 在 RediSearch 模块中引入了对向量(Vector)数据的支持,特别是在 向量搜索 和 近似最近邻搜索(ANN) 上。这使得 Redis 可以作为一个高效的向量数据库来存储和检索嵌入向量(例如,来自自然语言处...

1 简介

在 Redis 的最新版本中(Redis 7.x),包括了对向量数据和图片数据的支持,尤其是在 RediSearch 和 RedisAI 模块中。

具体来说:Redis 在 RediSearch 模块中引入了对向量(Vector)数据的支持,特别是在 向量搜索 和 近似最近邻搜索(ANN) 上。

这使得 Redis 可以作为一个高效的向量数据库来存储和检索嵌入向量(例如,来自自然语言处理模型或图像模型的向量)。

通过 RediSearch,Redis 支持对高维向量(如文本、图像的嵌入表示)进行索引和搜索,提供高效的向量相似度搜索(比如余弦相似度、欧几里得距离等)。

2 图片向量数据支持

Redis 原生不支持直接存储和处理图片数据(如 JPEG 或 PNG 格式),但通过 RedisAI 模块可以实现。RedisAI 允许将图像数据作为张量(tensor)进行存储,并可以用来运行机器学习模型、执行推理和处理图像数据。

Golang 示例:使用 Redis 向量数据和图片数据.

在 Golang 中,使用 Redis 进行向量数据存储和检索,以及处理图片数据的主要方式是通过相应的 Redis 客户端库(例如 github.com/go-redis/redis/v8)与 Redis 的扩展模块(如 RediSearch 和 RedisAI)配合使用。

以下是一个使用 Golang 的 Redis 客户端库来操作 Redis 向量数据和图片数据的简单示例:

3 示例:

  • 安装必要的依赖

首先,我们需要安装 Go 语言的 Redis 客户端库和相应的模块支持。

  go get github.com/go-redis/redis/v8
  go get github.com/RediSearch/redisearch-go
  • 向量数据存储和检索示例

     import (
         "context"
         "fmt"
         "log"
    
         "github.com/go-redis/redis/v8"
         "github.com/RediSearch/redisearch-go/redisearch"
     )
    
     var ctx = context.Background()
    
     func main() {
         // 连接到Redis
         client := redis.NewClient(&redis.Options{
             Addr: "localhost:6379", // Redis 服务器地址
         })
    
         // 创建 RedisSearch 客户端
         clientSearch := redisearch.NewClient("localhost:6379", "vector_index")
    
         // 创建向量索引
         schema := redisearch.NewSchema(
             redisearch.NewTextField("name", redisearch.TextFieldOptions{}),
             redisearch.NewVectorField("embedding", 128, redisearch.SimilarityCosine), // 128 维的向量
         )
         err := clientSearch.CreateIndex(schema)
         if err != nil {
             log.Fatalf("Error creating index: %v", err)
         }
    
         // 插入向量数据
         doc := redisearch.NewDocument("doc1", 1.0)
         doc.Set("name", "Item 1")
         embedding := []float32{0.1, 0.2, 0.3, 0.4} // 示例向量
         doc.SetVector("embedding", embedding)
    
         err = clientSearch.Index(doc)
         if err != nil {
             log.Fatalf("Error indexing document: %v", err)
         }
    
         // 查询最相似的向量
         query := redisearch.NewQuery("*").
             AddSortByVector("embedding", redisearch.SimilarityCosine, 3) // 查找3个最相似的向量
         res, err := clientSearch.Search(query)
         if err != nil {
             log.Fatalf("Error searching for vector: %v", err)
         }
    
         // 打印检索结果
         fmt.Println("Search Results:")
         for _, doc := range res.Documents {
             fmt.Printf("Document ID: %s\n", doc.Id)
         }
     }
    
  • 图像数据存储与推理示例(使用 RedisAI)

RedisAI 模块允许我们在 Redis 中直接存储和运行图像数据。例如,可以使用 RedisAI 存储图像并运行预训练的机器学习模型来进行推理。

以下是一个图像处理和推理的简单示例:

    import (
        "context"
        "fmt"
        "log"
        "os"

        "github.com/go-redis/redis/v8"
        "github.com/RedisAI/redisai-go/redisai"
    )

    var ctx = context.Background()

    func main() {
        // 连接到 Redis
        client := redis.NewClient(&redis.Options{
            Addr: "localhost:6379",
        })

        // 创建 RedisAI 客户端
        rAI := redisai.NewClient(client)

        // 加载模型(假设模型已存在)
        modelName := "image_model"
        modelPath := "/path/to/your/model" // 这里指定你要加载的 AI 模型文件路径
        _, err := rAI.ModelSet(ctx, modelName, modelPath, nil)
        if err != nil {
            log.Fatalf("Error loading model: %v", err)
        }

        // 读取图片文件并进行处理(假设我们是处理图片为张量)
        imagePath := "/path/to/your/image.jpg"
        imgFile, err := os.Open(imagePath)
        if err != nil {
            log.Fatalf("Error opening image: %v", err)
        }
        defer imgFile.Close()

        // 将图片加载为张量(这里我们假设有个合适的函数将图片转换为张量)
        tensor, err := LoadImageAsTensor(imgFile) // 需要定义 LoadImageAsTensor 函数
        if err != nil {
            log.Fatalf("Error converting image to tensor: %v", err)
        }

        // 将张量存储到 Redis
        err = rAI.TensorSet(ctx, "input_tensor", tensor)
        if err != nil {
            log.Fatalf("Error setting tensor to Redis: %v", err)
        }

        // 使用已加载的模型进行推理
        err = rAI.ModelRun(ctx, modelName, []string{"input_tensor"}, []string{"output_tensor"})
        if err != nil {
            log.Fatalf("Error running model: %v", err)
        }

        // 获取推理结果
        outputTensor, err := rAI.TensorGet(ctx, "output_tensor")
        if err != nil {
            log.Fatalf("Error getting output tensor: %v", err)
        }

        // 打印推理结果(这里仅为示例,实际输出会根据模型和图像不同)
        fmt.Println("Inference Result:", outputTensor)
    }

    // 示例函数:加载图片并将其转换为张量
    func LoadImageAsTensor(file *os.File) (*redisai.Tensor, error) {
        // 这里我们假设你已经有一个方法将图片文件转换为张量
        // 你可以使用像 GoCV 或其他图像处理库来做这部分工作
        return nil, fmt.Errorf("LoadImageAsTensor function is not implemented")
    }

向量数据存储和检索:我们使用了 RediSearch 模块来创建一个向量索引,并将向量数据(如文本、图像嵌入等)存储在 Redis 中。之后,我们执行一个简单的查询来找出最相似的向量。

图像数据存储与推理:使用 RedisAI 模块,我们可以将图像数据作为张量存储并进行推理。这里的图像加载和转换为张量的部分需要具体的图像处理库来实现(例如 GoCV 或其他)。

4 小结

Redis 最新版本的确支持向量数据和图片数据处理,尤其是在结合 RediSearch 和 RedisAI 模块时,Redis 不仅能存储向量数据(如文本、图像的嵌入表示),还能运行机器学习模型进行推理。

这使得 Redis 在大规模生产式人工智能应用中成为一个强大的支持工具。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。