当前位置:   article > 正文

Java-SpringBoot集成Langchain4j文本嵌入模型实现向量相似度查询_springboot整合langchain4j

springboot整合langchain4j

 集成Pg数据库并创建vector字段类型

运行pgvector容器 根据需要进行容器目录挂载

  1. docker run --name pgvector \
  2. -e POSTGRES_PASSWORD=123456 \
  3. -p 5432:5432 \
  4. -d --platform linux/amd64 ankane/pgvector:latest

进入docker容器并创建vector字段类型

docker exec -it pgvector bash
psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS vector;"

集成Langchain4j所需依赖

  1. <dependency>
  2. <groupId>dev.langchain4j</groupId>
  3. <artifactId>langchain4j-spring-boot-starter</artifactId>
  4. <version>0.30.0</version>
  5. </dependency>
  6. <!-- 主要用于查询向量数据库-->
  7. <dependency>
  8. <groupId>dev.langchain4j</groupId>
  9. <artifactId>langchain4j-pgvector</artifactId>
  10. <version>0.31.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>dev.langchain4j</groupId>
  14. <artifactId>langchain4j</artifactId>
  15. <version>0.30.0</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>dev.langchain4j</groupId>
  19. <artifactId>langchain4j-open-ai</artifactId>
  20. <version>0.30.0</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>dev.langchain4j</groupId>
  24. <artifactId>langchain4j-hugging-face</artifactId>
  25. <version>0.30.0</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>dev.langchain4j</groupId>
  29. <artifactId>langchain4j-vertex-ai</artifactId>
  30. <version>0.30.0</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>dev.langchain4j</groupId>
  34. <artifactId>langchain4j-embeddings</artifactId>
  35. <version>0.30.0</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>dev.langchain4j</groupId>
  39. <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
  40. <version>0.30.0</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>dev.langchain4j</groupId>
  44. <artifactId>langchain4j-document-parser-apache-tika</artifactId>
  45. <version>0.30.0</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.apache.poi</groupId>
  49. <artifactId>poi-ooxml</artifactId>
  50. <version>5.2.3</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>net.sourceforge.tess4j</groupId>
  54. <artifactId>tess4j</artifactId>
  55. <version>4.5.2</version>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.postgresql</groupId>
  59. <artifactId>postgresql</artifactId>
  60. </dependency>

SpringBoot连接Pg数据库以及配置向量连接

  1. spring:
  2. datasource:
  3. url: jdbc:postgresql://localhost:5432/postgres
  4. username: postgres
  5. password: postgres

配置类

  1. @Configuration
  2. public class PgVectorConfiguration {
  3. @Bean
  4. public PgVectorEmbeddingStore embeddingStore() {
  5. return PgVectorEmbeddingStore.builder()
  6. //指定主机地址
  7. .host("localhost")
  8. //指定端口
  9. .port(5432)
  10. //指定数据库名
  11. .database("postgres")
  12. //指定用户名
  13. .user("postgres")
  14. //指定密码
  15. .password("postgres")
  16. //指定向量数据所在表名
  17. .table("knowledge_vector")
  18. //指定向量维度
  19. .dimension(384)
  20. .build();
  21. }
  22. }

Java实体类配置

@TableName、@TableId以及@TableField集成MyBatis-plus根据自己ORM框架修改

  1. @TableName("knowledge_vector")
  2. @Data
  3. public class KnowledgeVectorDO {
  4. @TableId(value = "embedding_id", type = IdType.ASSIGN_ID)
  5. private Long embeddingId;
  6. @TableField("knowledge_id")
  7. private Long knowledgeId;
  8. @TableField("text")
  9. private String text;
  10. @TableField("embedding")
  11. private List<Float> embedding;
  12. @TableField("metadata")
  13. private String metaData;
  14. }

注:embedding_id、text、embedding、metadata是必备字段 字段名不能修改 如果embedding需要处理大量的向量数据,并且这些数据的精度要求不高,使用float会更高效,占用更少的存储空间。如果应用场景对数值精度要求较高,例如科学计算或金融应用,应该选择 double。

  1. embedding_id:向量表的Id
  2. text:文本切分后的数据块
  3. embedding:存储的向量数据
  4. metadata:元数据

业务代码

  1. /**
  2. *
  3. * @param text 匹配的内容
  4. */
  5. public void getKnowledgeByText(String text){
  6. //它是一个使用 AllMiniLmL6V2 模型的实例。文本嵌入模型通常是由预训练的神经网络组成,用于将文本转换为高维向量表示,以捕捉文本之间的语义关系。
  7. EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
  8. //将给定的文本 text 嵌入到高维向量空间中,返回一个表示该文本的嵌入向量
  9. Embedding queryEmbedding = embeddingModel.embed(text).content();
  10. //用于在嵌入向量空间中查找与给定查询向量最相似的文本片段。queryEmbedding 是我们之前嵌入的查询文本的向量表示,而参数 1 表示要返回与查询向量最相似的文本片段数量。
  11. List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.findRelevant(queryEmbedding, 1);
  12. //从返回的相似文本片段列表 relevant 中获取第一个匹配结果,即与查询向量最相似的文本片段。这个结果被存储在 embeddingMatch 变量中,可以通过它来访问相似度分数和文本内容等信息。
  13. EmbeddingMatch<TextSegment> embeddingMatch = relevant.get(0);
  14. //对应数据表的Id
  15. System.out.println("tableId:"+embeddingMatch.embeddingId());
  16. //根据向量查询到的内容
  17. System.out.println("text:"+embeddingMatch.embedded().text());
  18. //表示查询向量与返回的相似文本片段之间的相似度得分。 得分越高表示两个向量之间的语义关系越相似。值越接近1表示相似度越高,值越接近0表示相似度越低
  19. System.out.println("score:"+embeddingMatch.score());
  20. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/787062
推荐阅读
相关标签
  

闽ICP备14008679号