Embeddings和Vector入门

Embeddings

文本嵌入(Embeddings)将文本转换为数值数组或向量,使人工智能模型能够处理和理解语言数据。这种从文本到数字的转换以及反向转换,是人工智能如何与人类语言互动和理解它的关键要素。

文本嵌入在诸如检索增强生成 (RAG) 模式等实际应用中尤为重要。将参考文档转换为向量保存在向量数据库中,将输入内容经过同样的嵌入处理,得到一个向量,并计算两者向量的距离得到相似性。

Vector Databases

向量数据库(Vector Databases)是一种在人工智能应用中扮演着重要角色的特殊数据库类型。与传统的关系型数据库不同,向量数据库中的查询不是进行精确匹配,而是执行相似性搜索。当使用向量作为查询时,向量数据库会返回与查询向量"相似"的向量。

向量数据库用于将您的数据与人工智能模型集成。使用它们的第一步是将您的数据加载到向量数据库中。然后,当用户查询需要发送到人工智能模型时,首先会检索一组相似的文档。然后,这些文档连同用户的查询一起作为用户问题的上下文发送到人工智能模型。这种技术称为检索增强生成 (Retrieval Augmented Generation, RAG)。

RAG 处理流程

环境准备

项目pom增加向量数据库依赖:

xml 复制代码
<!-- redis ai-->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

Docker搭建RedisVectorStore

shell 复制代码
sudo docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 -v redis-stack-data:/data redis/redis-stack:latest

命令解释: -d:在容器后台运行; -p 6379:6379:端口映射(Redis端口) -p [宿主机端口]:[容器端口]; -p 8001:8001:端口映射(RedisInsight可视化工具端口) -p [宿主机端口]:[容器端口]; -v redis-stack-data:/data:数据卷挂载 -v [数据卷]:[容器目录\文件]; --name redis-stack:设置容器名称 --name [容器名称]; redis/redis-stack:latest:镜像版本名称;

部署实例

配置信息

yaml 复制代码
redis:
  url: redis://172.31.14.139:6379
  index: post
  numeric: year

创建RedisConfig配置类

java 复制代码
@Data
@Component
@ConfigurationProperties(prefix = "redis")
public class RedisConfig {

    private String url;

    private String index;

    private String tag;

    private String text;

    private String numeric;
}

创建Redis向量数据库和内存向量数据库对象

java 复制代码
@Configuration
public class VectorStoreConfig {

    @Bean
    public SimpleVectorStore simpleVectorStore(OllamaEmbeddingClient embeddingClient) {
        return new SimpleVectorStore(embeddingClient);
    }

    @Bean
    public JedisPooled jedisPooled(RedisConfig redisConfig) {
        return new JedisPooled(redisConfig.getUrl());
    }

    @Bean
    public RedisVectorStore redisVectorStore(RedisConfig redisConfig, OllamaEmbeddingClient embeddingClient) {
        RedisVectorStore.RedisVectorStoreConfig config = RedisVectorStore.RedisVectorStoreConfig.builder()
                .withURI(redisConfig.getUrl()).withIndexName(redisConfig.getIndex())
                .withMetadataFields(RedisVectorStore.MetadataField.numeric(redisConfig.getNumeric())).build();
        RedisVectorStore redisVectorStore = new RedisVectorStore(config, embeddingClient);
        return redisVectorStore;
    }
}

单元测试

示例一

controller代码

java 复制代码
@GetMapping("/chat/call3")
public List<List<Double>> call3() {
    return embeddingClient.embed(List.of("Hello World", "World is big and salvation is near"));
}

测试用例

java 复制代码
@Test
public void call3Test() throws Exception {
    String url = "/chat/call3";
    mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}

执行结果

示例二

controller代码

java 复制代码
@GetMapping("/chat/call4")
public List<List<Double>> call4() {
    return embeddingClient.embed(List.of("MyBatis 分页插件 PageHelper", "MyBatis 通用Mapper", "MyBatis 最新的 mybatis-mapper"));
}

测试用例

java 复制代码
@Test
public void call4Test() throws Exception {
    String url = "/chat/call4";
    mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}

执行结果

示例三

controller代码

java 复制代码
@GetMapping("/chat/call5")
public EmbeddingResponse call5() {
    return embeddingClient.embedForResponse(List.of("Hello World", "World is big and salvation is near"));
}

测试用例

java 复制代码
@Test
public void call5Test() throws Exception {
    String url = "/chat/call5";
    mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}

执行结果

示例四

controller代码

java 复制代码
@GetMapping("/chat/call6")
public List<Document> call6() {
    List<Document> documents = List.of(new Document("MyBatis 分页插件 PageHelper", Map.of("year", 2014)), 
            new Document("MyBatis 通用Mapper", Map.of("year", 2014)), 
            new Document("MyBatis 最新的 mybatis-mapper", Map.of("year", 2019)));
    vectorStore.add(documents);
    return vectorStore.similaritySearch(SearchRequest.query("插件").withTopK(2));
}

测试用例

java 复制代码
@Test
public void call6Test() throws Exception {
    String url = "/chat/call6";
    mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}

执行结果

java 复制代码
MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = [{"embedding":[],"content":"MyBatis 通用Mapper","id":"00245bd0-ce14-4a75-82aa-dde3015ede37","metadata":{"year":"2014","vector_score":0.22201413}},{"embedding":[],"content":"MyBatis 分页插件 PageHelper","id":"c072fb56-7daf-42ef-aa6f-7c4551eedc0e","metadata":{"year":"2014","vector_score":0.30925614}}]
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

示例五

controller代码

java 复制代码
@GetMapping("/chat/call7")
public List<Embedding> call7() {
    OllamaOptions ollamaOptions = OllamaOptions.create();
    ollamaOptions.withModel("qwen:latest").setTemperature(0.7f);
    List<String> message = List.of("Hello World", "World is big and salvation is near");
    EmbeddingRequest request = new EmbeddingRequest(message, ollamaOptions);
    EmbeddingResponse embeddingResponse = embeddingClient.call(request);
    return embeddingResponse.getResults();
}

测试用例

java 复制代码
@Test
public void call7Test() throws Exception {
    String url = "/chat/call7";
    mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}

执行结果

相关推荐
我算是程序猿16 分钟前
用AI做电子萌宠,快速涨粉变现
人工智能·stable diffusion·aigc
萱仔学习自我记录19 分钟前
微调大语言模型——超详细步骤
人工智能·深度学习·机器学习
湘大小菜鸡29 分钟前
NLP进阶(一)
人工智能·自然语言处理
XiaoLiuLB36 分钟前
最佳语音识别 Whisper-large-v3-turbo 上线,速度更快(本地安装 )
人工智能·whisper·语音识别
哪 吒39 分钟前
吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)
人工智能·ai·自然语言处理·chatgpt·aigc
Eric.Lee202142 分钟前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
爱喝白开水a44 分钟前
关于大模型在企业生产环境中的独立部署问题
人工智能·深度学习·llm·大语言模型·ai大模型·计算机技术·本地部署大模型
可惜已不在2 小时前
AI 搜索引擎工具集合
人工智能·ai
Landy_Jay2 小时前
深度学习:基于MindSpore实现CycleGAN壁画修复
人工智能·深度学习
Langchain2 小时前
不可错过!CMU最新《生成式人工智能大模型》课程:从文本、图像到多模态大模型
人工智能·自然语言处理·langchain·大模型·llm·大语言模型·多模态大模型