diff --git a/pom.xml b/pom.xml index bc950bf..9e28d15 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,21 @@ spring-ai-markdown-document-reader 1.0.0-M6 + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.postgresql + postgresql + runtime + + + org.springframework.ai + spring-ai-pgvector-store + 1.0.0-M6 + diff --git a/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java b/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java index 8ab3ce0..c9d81e1 100644 --- a/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java +++ b/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java @@ -1,9 +1,13 @@ package com.huangge1199.aiagent; +import org.springframework.ai.autoconfigure.vectorstore.pgvector.PgVectorStoreAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +/** + * @author hyy + */ +@SpringBootApplication(exclude = PgVectorStoreAutoConfiguration.class) public class LongAiAgentApplication { public static void main(String[] args) { diff --git a/src/main/java/com/huangge1199/aiagent/Service/DBService.java b/src/main/java/com/huangge1199/aiagent/Service/DBService.java new file mode 100644 index 0000000..a40cc41 --- /dev/null +++ b/src/main/java/com/huangge1199/aiagent/Service/DBService.java @@ -0,0 +1,15 @@ +package com.huangge1199.aiagent.Service; + +import org.springframework.ai.document.Document; + +import java.util.List; + +/** + * DBService + * + * @author huangge1199 + * @since 2025/5/27 10:46:40 + */ +public interface DBService { + List similaritySearch(); +} diff --git a/src/main/java/com/huangge1199/aiagent/Service/impl/DBServiceImpl.java b/src/main/java/com/huangge1199/aiagent/Service/impl/DBServiceImpl.java new file mode 100644 index 0000000..14a9953 --- /dev/null +++ b/src/main/java/com/huangge1199/aiagent/Service/impl/DBServiceImpl.java @@ -0,0 +1,37 @@ +package com.huangge1199.aiagent.Service.impl; + +import com.huangge1199.aiagent.Service.DBService; +import jakarta.annotation.Resource; +import org.springframework.ai.document.Document; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * DBServiceImpl + * + * @author huangge1199 + * @since 2025/5/27 10:46:56 + */ +@Service +public class DBServiceImpl implements DBService { + + @Resource + VectorStore pgVectorVectorStore; + + + @Override + public List similaritySearch() { + List documents = List.of( + new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")), + new Document("The World is Big and Salvation Lurks Around the Corner"), + new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2"))); + // 添加文档 + pgVectorVectorStore.add(documents); + // 相似度查询 + return pgVectorVectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build()); + } +} diff --git a/src/main/java/com/huangge1199/aiagent/config/PgVectorVectorStoreConfig.java b/src/main/java/com/huangge1199/aiagent/config/PgVectorVectorStoreConfig.java new file mode 100644 index 0000000..a0c1782 --- /dev/null +++ b/src/main/java/com/huangge1199/aiagent/config/PgVectorVectorStoreConfig.java @@ -0,0 +1,55 @@ +package com.huangge1199.aiagent.config; + +import com.huangge1199.aiagent.rag.DocumentLoaderUtils; +import jakarta.annotation.Resource; +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.ai.vectorstore.pgvector.PgVectorStore; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; + +import static org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgDistanceType.COSINE_DISTANCE; +import static org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIndexType.HNSW; + +/** + * pgConfi + * + * @author huangge1199 + * @since 2025/5/27 9:52:30 + */ +@Configuration +public class PgVectorVectorStoreConfig { + + @Resource + private DocumentLoaderUtils documentLoaderUtils; + + @Bean + public VectorStore vectorStore(JdbcTemplate jdbcTemplate, @Qualifier("ollamaEmbeddingModel") EmbeddingModel embeddingModel) { + // 设置向量维度,默认为模型维度或1536 + // 设置距离类型,默认为 COSINE_DISTANCE + // 设置索引类型,默认为 HNSW + // 是否初始化模式,默认为 false + // 设置模式名称,默认为 "public" + // 设置向量表名称,默认为 "vector_store" + // 设置最大文档批处理大小,默认为 10000 + return PgVectorStore.builder(jdbcTemplate, embeddingModel) + // 设置向量维度,默认为模型维度或1536 + .dimensions(1024) + // 设置距离类型,默认为 COSINE_DISTANCE + .distanceType(COSINE_DISTANCE) + // 设置索引类型,默认为 HNSW + .indexType(HNSW) + // 是否初始化模式,默认为 false + .initializeSchema(true) + // 设置模式名称,默认为 "public" + .schemaName("public") + // 设置向量表名称,默认为 "vector_store" + .vectorTableName("vector_store") + // 设置最大文档批处理大小,默认为 10000 + .maxDocumentBatchSize(10000) + .build(); + } +} + diff --git a/src/main/java/com/huangge1199/aiagent/controller/DBController.java b/src/main/java/com/huangge1199/aiagent/controller/DBController.java new file mode 100644 index 0000000..0e73466 --- /dev/null +++ b/src/main/java/com/huangge1199/aiagent/controller/DBController.java @@ -0,0 +1,35 @@ +package com.huangge1199.aiagent.controller; + +import com.huangge1199.aiagent.Service.DBService; +import com.huangge1199.aiagent.common.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.ai.document.Document; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * DBController + * + * @author huangge1199 + * @since 2025/5/27 10:37:25 + */ +@RestController +@RequestMapping("/db") +@Tag(name = "数据库相关") +public class DBController { + + @Resource + private DBService dbService; + + @PostMapping("/similaritySearch") + @Operation(summary = "相似度查询") + public R> similaritySearch() { + List results = dbService.similaritySearch(); + return R.ok(results); + } +} diff --git a/src/main/java/com/huangge1199/aiagent/rag/RagConfig.java b/src/main/java/com/huangge1199/aiagent/rag/RagConfig.java index 2ab8d75..121f97b 100644 --- a/src/main/java/com/huangge1199/aiagent/rag/RagConfig.java +++ b/src/main/java/com/huangge1199/aiagent/rag/RagConfig.java @@ -2,16 +2,9 @@ package com.huangge1199.aiagent.rag; import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.document.Document; -import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.vectorstore.SimpleVectorStore; -import org.springframework.ai.vectorstore.VectorStore; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.List; - /** * RagConfig * @@ -35,17 +28,4 @@ public class RagConfig { return builder.defaultSystem("你将作为一名恋爱大师,对于用户的问题作出解答") .build(); } - - @Bean - VectorStore vectorStore(@Qualifier("ollamaEmbeddingModel") EmbeddingModel embeddingModel) { - SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build(); -// // 加载文档 -// List documentList = documentLoaderUtils.loadMarkdowns(); -// // 自主切分文档 -// List splitDocuments = myTokenTextSplitter.splitCustomized(documentList); -// // 自动补充关键词元信息 -// List enrichedDocuments = myKeywordEnricher.enrichDocuments(documentList); -// simpleVectorStore.add(enrichedDocuments); - return simpleVectorStore; - } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 907fe40..b3640e9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,6 +12,12 @@ spring: base-url: http://192.168.188.2:11435 chat: model: gemma3:1b + vectorstore: + pgvector: + index-type: HNSW + distance-type: COSINE_DISTANCE + dimensions: 1536 + max-document-batch-size: 10000 server: port: 8123 servlet: