当前位置:   article > 正文

Spring Boot 使用 Spring AI 构建知识库服务_springai怎么调用知识库

springai怎么调用知识库

目录

前言

环境准备

JDK17

Spring Boot 3.2.4

Ollama

PostgreSQL16

下载向量化模型

pom

yml

 EmbeddingController

向量化示例

向量化文本

向量化检索

ChatController

知识库示例


前言

做 AI 大模型技术调研时,参考的开源项目 Maxkb,它基于大模型做了一个知识库的应用,用户可构建自己的知识库,创建自己的应用然后关联知识库,这样可以基于知识库里的内容让大模型的回答更加符合我们地预期。

虽然 Maxkb 是使用 Python 写的,不过参考它用到的相关模型和数据库,可以用 Spring Boot 来构建一个自己的知识库服务。Spring Boot 也提供了 AI 相关的库,这使得接入 AI 大模型能力也十分方便。

以下是使用Spring Boot 构建一个知识库的样例。

环境准备

JDK17

Spring Boot 3.2.4

Ollama

如果没有安装,可参考以下博客安装并下载 qwen2 大模型

Ollama 部署本地大模型-CSDN博客文章浏览阅读456次,点赞15次,收藏13次。工作需要,被指派对大模型做技术调研,又不想花钱买各大产商的key,所以就考虑部署本地的大模型,了解到 Ollama 开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。便在自己电脑上安装了,记录下安装以及使用过程。https://blog.csdn.net/typeracer/article/details/140707448

PostgreSQL16

如果没有安装,可参考以下博客安装并安装 vector 扩展

Windows 安装 PostgreSQL 并安装 vector 扩展-CSDN博客文章浏览阅读502次,点赞5次,收藏5次。调研大模型时,了解到一些大模型的应用,其中一个就是知识库,用户可以上传文档到知识库中,系统解析文档并将内容向量化保存起来,以便在和模型交互时使用。在和大模型对话时,可以先向量化检索自己的知识库,如果命中,则返回文档内容,然后将文档内容作为大模型的输入,以便让大模型回答得更加符合我们的预期。这里就涉及到了向量化数据的存储,可以为 PostgreSQL 安装 vector 扩展来存储向量化数据。记录 Windows 安装 PostgreSQL 以及 vector 扩展的步骤。https://blog.csdn.net/typeracer/article/details/140711057选择一个数据库实例,安装扩展,然后创建 vector_store 表

  1. CREATE EXTENSION IF NOT EXISTS vector;
  2. CREATE EXTENSION IF NOT EXISTS hstore;
  3. CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  4. CREATE TABLE IF NOT EXISTS vector_store (
  5. id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
  6. content text,
  7. metadata json,
  8. embedding vector(768)
  9. );
  10. CREATE INDEX ON vector_store USING HNSW (embedding vector_cosine_ops);

下载向量化模型

shibing624_text2vec-base-chinese

下载地址:

https://huggingface.co/shibing624/text2vec-base-chineseicon-default.png?t=N7T8https://huggingface.co/shibing624/text2vec-base-chinese将下载的模型放到项目工程 resources 文件夹下

pom

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-dependencies</artifactId>
  6. <version>3.2.4</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.ai</groupId>
  12. <artifactId>spring-ai-bom</artifactId>
  13. <version>1.0.0-SNAPSHOT</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.ai</groupId>
  26. <artifactId>spring-ai-transformers-spring-boot-starter</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.ai</groupId>
  30. <artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.postgresql</groupId>
  34. <artifactId>postgresql</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.ai</groupId>
  38. <artifactId>spring-ai-tika-document-reader</artifactId>
  39. </dependency>
  40. </dependencies>
  41. <repositories>
  42. <!-- 里程碑(Milestone)-->
  43. <repository>
  44. <id>spring-milestones</id>
  45. <name>Spring Milestones</name>
  46. <url>https://repo.spring.io/milestone</url>
  47. <snapshots>
  48. <enabled>true</enabled>
  49. </snapshots>
  50. </repository>
  51. <!-- 快照(Snapshot)-->
  52. <repository>
  53. <id>spring-snapshots</id>
  54. <name>Spring Snapshots</name>
  55. <url>https://repo.spring.io/snapshot</url>
  56. <releases>
  57. <enabled>false</enabled>
  58. </releases>
  59. </repository>
  60. </repositories>

yml

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: postgres
    driver-class-name: org.postgresql.Driver
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: qwen2

    embedding:
      transformer:
        onnx:
          modelUri: classpath:/shibing624_text2vec-base-chinese/onnx/model.onnx
        tokenizer:
          uri: classpath:/shibing624_text2vec-base-chinese/onnx/tokenizer.json
    vectorstore:
      pgvector:
        index-type: HNSW
        distance-type: COSINE_DISTANCE
        dimensions: 768

server:
  port: 8888

 更多ai模型和向量模型的详细配置可参照官方文档

ETL Pipeline :: Spring AI Referenceicon-default.png?t=N7T8https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html

 EmbeddingController

  1. @RestController
  2. public class EmbeddingController {
  3. @Autowired
  4. @Qualifier("embeddingModel")
  5. EmbeddingModel embeddingModel;
  6. @Autowired
  7. VectorStore vectorStore;
  8. @GetMapping("/ai/embedding")
  9. public void embed(@RequestParam(value = "message") String message) {
  10. System.out.println(embeddingModel.embed(message));
  11. System.out.println("ok");
  12. }
  13. @PostMapping("/ai/vectorStore")
  14. public List<String> vectorStore(@RequestParam(name = "file") MultipartFile file) throws Exception {
  15. // 从IO流中读取文件
  16. TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
  17. // 将文本内容划分成更小的块
  18. List<Document> splitDocuments = new TokenTextSplitter()
  19. .apply(tikaDocumentReader.read());
  20. // 存入向量数据库,这个过程会自动调用embeddingModel,将文本变成向量再存入。
  21. vectorStore.add(splitDocuments);
  22. return splitDocuments.stream().map(Document::getContent).collect(toList());
  23. }
  24. @GetMapping("/ai/vectorSearch")
  25. public List<String> vectorSearch(@RequestParam(name = "text") String text) {
  26. List<Document> documents = vectorStore.similaritySearch(SearchRequest.query(text).withTopK(1));
  27. return documents.stream().map(Document::getContent).collect(toList());
  28. }
  29. }

向量化示例

使用 AI 随便生成一段文本内容,这里让 AI 生成了 ollama 相关的文本

向量化文本

上传文档到知识库,其实就是调用向量化接口 /ai/vectorStore

查询向量数据库,可以看到插入了两条数据

代码中使用了 TokenTextSplitter 进行了分段处理,文档内容过多会被切割成多个再进行向量化

向量化检索

调用 /ai/vectorSearch 接口进行向量化检索

查询 vector_store 表,返回最匹配的一行数据

ChatController

  1. @RestController
  2. public class ChatController {
  3. @Autowired
  4. OllamaChatModel ollamaChatModel;
  5. @Autowired
  6. OllamaApi ollamaApi;
  7. @Autowired
  8. VectorStore vectorStore;
  9. @GetMapping("/ai/generate")
  10. public String generate(@RequestParam(value = "message") String message) {
  11. return ollamaChatModel.call(message);
  12. }
  13. @GetMapping("/ai/generateStream")
  14. public Flux<ChatResponse> generateStream(@RequestParam(value = "message") String message) {
  15. Prompt prompt = new Prompt(new UserMessage(message));
  16. return ollamaChatModel.stream(prompt);
  17. }
  18. @GetMapping("/ai/ollamaApi")
  19. public OllamaApi.ChatResponse ollamaApi(@RequestParam(value = "message") String message) {
  20. //从知识库检索相关信息,再将检索得到的信息同用户的输入一起构建一个prompt,最后调用ollama api
  21. List<Document> documents = vectorStore.similaritySearch(SearchRequest.query(message).withTopK(1));
  22. String targetMessage = String.format("已知信息:%s\n 用户提问:%s\n",
  23. documents.get(0).getContent(), message);
  24. OllamaApi.ChatRequest request = OllamaApi.ChatRequest.builder("qwen2")
  25. .withStream(false) // not streaming
  26. .withMessages(List.of(
  27. OllamaApi.Message.builder(OllamaApi.Message.Role.USER)
  28. .withContent(targetMessage)
  29. .build()))
  30. .withOptions(OllamaOptions.create().withTemperature(0.9f))
  31. .build();
  32. return ollamaApi.chat(request);
  33. }
  34. }

知识库示例

调用 /ai/ollamaApi 接口

先从知识库检索相关信息

再将检索得到的信息同用户的输入一起构建一个 prompt

最后调用 ollama api

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

闽ICP备14008679号