Skip to content

Commit 273404f

Browse files
committed
update to Spring AI 1.0.0-M6
1 parent 246d20d commit 273404f

22 files changed

+210
-139
lines changed

README.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
## 运行
44

5-
需要在本地安装 Ollama 和 Docker Desktop。使用 Docker Desktop 来运行
6-
Redis。参考 `docker-compose.yaml` 文件。
5+
需要在本地安装 Docker Desktop。使用 Docker Desktop 来运行
6+
Pgvector。参考 `docker-compose.yaml` 文件。
77

8-
默认使用通义千问 0.5b 模型(`qwen:0.5b`),可以通过配置文件来修改。
8+
默认使用通义千问 2.5 0.5b 模型(`qwen2.5:0.5b`),可以通过配置文件来修改。
99

1010
> 朴素 RAG 的结果,依赖于文档相似性的查询结果。在本地运行时,受限于模型的参数数量,查询结果可能不太准确。
1111
12-
使用 `dev` profile 来运行 Spring,`-Dspring.profiles.active=dev`
13-
1412
访问 [Swagger UI](http://localhost:8080/swagger-ui/index.html) 来与 API 交互。
1513

1614
## 加载网页到向量数据库
@@ -25,14 +23,16 @@ Redis。参考 `docker-compose.yaml` 文件。
2523

2624
## 与大模型交互
2725

28-
发送 POST 请求到 `/chat/query`,提供消息内容。
26+
发送 POST 请求到 `/chat`,提供消息内容。
2927

3028
```json
3129
{
32-
"message": "从2024年政府工作报告中,分析人工智能的发展前景"
30+
"input": "从2024年政府工作报告中,分析人工智能的发展前景"
3331
}
3432
```
3533

34+
通过用户界面进行交互,访问 http://localhost:8080/webjars/chat-agent-ui/index.html
35+
3636
## 课程
3737

3838
[![课程](./course.png)](https://www.bilibili.com/cheese/play/ss15645)

docker-compose.yaml

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
version: "3"
21
services:
3-
redis-stack:
4-
image: redis/redis-stack
2+
postgres:
3+
image: pgvector/pgvector:0.8.0-pg16
54
volumes:
6-
- redis-data:/data
5+
- postgresql-data:/var/lib/postgresql/data
6+
environment:
7+
POSTGRES_DB: "postgres"
8+
POSTGRES_USER: "postgres"
9+
POSTGRES_PASSWORD: "postgres"
710
ports:
8-
- "6379:6379"
9-
- "8001:8001"
11+
- "5432:5432"
1012
volumes:
11-
redis-data:
13+
postgresql-data:

pom.xml

+8-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<groupId>org.springframework.boot</groupId>
88
<artifactId>spring-boot-starter-parent</artifactId>
99
<version>3.2.4</version>
10-
<relativePath/> <!-- lookup parent from repository -->
10+
<relativePath/>
1111
</parent>
1212
<groupId>cc.vividcode.ai</groupId>
1313
<artifactId>spring-ai-naive-rag</artifactId>
@@ -16,7 +16,7 @@
1616
<description>Spring AI Naive RAG</description>
1717
<properties>
1818
<java.version>21</java.version>
19-
<spring-ai.version>0.8.1</spring-ai.version>
19+
<spring-ai.version>1.0.0-M6</spring-ai.version>
2020
</properties>
2121
<dependencies>
2222
<dependency>
@@ -29,7 +29,7 @@
2929
</dependency>
3030
<dependency>
3131
<groupId>org.springframework.ai</groupId>
32-
<artifactId>spring-ai-redis</artifactId>
32+
<artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
3333
</dependency>
3434

3535
<dependency>
@@ -47,6 +47,11 @@
4747
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
4848
<version>2.5.0</version>
4949
</dependency>
50+
<dependency>
51+
<groupId>com.javaaidev</groupId>
52+
<artifactId>chat-agent-ui</artifactId>
53+
<version>0.5.1</version>
54+
</dependency>
5055

5156
<dependency>
5257
<groupId>org.springframework.boot</groupId>

src/main/java/cc/vividcode/ai/naiverag/chat/ChatRequest.java

-5
This file was deleted.

src/main/java/cc/vividcode/ai/naiverag/etl/EtlModuleConfiguration.java

-40
This file was deleted.

src/main/java/cc/vividcode/ai/naiverag/etl/RedisConfig.java

-8
This file was deleted.

src/main/java/cc/vividcode/ai/naiverag/etl/WebPageReader.java

-28
This file was deleted.

src/main/java/cc/vividcode/ai/naiverag/NaiveRagApplication.java renamed to src/main/java/com/javaaidev/naiverag/NaiveRagApplication.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package cc.vividcode.ai.naiverag;
1+
package com.javaaidev.naiverag;
22

3-
import cc.vividcode.ai.naiverag.chat.ChatModuleConfiguration;
4-
import cc.vividcode.ai.naiverag.etl.EtlModuleConfiguration;
3+
import com.javaaidev.naiverag.chat.ChatModuleConfiguration;
4+
import com.javaaidev.naiverag.etl.EtlModuleConfiguration;
55
import org.springframework.boot.SpringApplication;
66
import org.springframework.boot.autoconfigure.SpringBootApplication;
77
import org.springframework.context.annotation.Import;
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
package cc.vividcode.ai.naiverag.chat;
1+
package com.javaaidev.naiverag.chat;
22

33
import org.springframework.web.bind.annotation.PostMapping;
44
import org.springframework.web.bind.annotation.RequestBody;
5-
import org.springframework.web.bind.annotation.RequestMapping;
65
import org.springframework.web.bind.annotation.RestController;
76

87
@RestController
9-
@RequestMapping("/chat")
108
public class ChatController {
119

1210
private final ChatService chatService;
@@ -15,8 +13,8 @@ public ChatController(ChatService chatService) {
1513
this.chatService = chatService;
1614
}
1715

18-
@PostMapping("/query")
19-
public String chat(@RequestBody ChatRequest request) {
20-
return chatService.chat(request);
16+
@PostMapping("/chat")
17+
public ChatResponse chat(@RequestBody ChatRequest request) {
18+
return new ChatResponse(chatService.chat(request));
2119
}
2220
}

src/main/java/cc/vividcode/ai/naiverag/chat/ChatModuleConfiguration.java renamed to src/main/java/com/javaaidev/naiverag/chat/ChatModuleConfiguration.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
package cc.vividcode.ai.naiverag.chat;
1+
package com.javaaidev.naiverag.chat;
22

3-
import org.springframework.ai.chat.ChatClient;
3+
import org.springframework.ai.chat.client.ChatClient;
44
import org.springframework.ai.vectorstore.VectorStore;
55
import org.springframework.context.annotation.Bean;
66
import org.springframework.context.annotation.Configuration;
77

88
@Configuration
99
public class ChatModuleConfiguration {
1010

11+
@Bean
12+
public ChatClient chatClient(ChatClient.Builder builder) {
13+
return builder.build();
14+
}
15+
1116
@Bean
1217
public ChatService chatService(ChatClient chatClient,
1318
VectorStore vectorStore) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.javaaidev.naiverag.chat;
2+
3+
public record ChatRequest(String input) {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.javaaidev.naiverag.chat;
2+
3+
public record ChatResponse(String output) {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
package cc.vividcode.ai.naiverag.chat;
1+
package com.javaaidev.naiverag.chat;
22

33
import java.util.Map;
44
import java.util.stream.Collectors;
5-
import org.springframework.ai.chat.ChatClient;
5+
import org.springframework.ai.chat.client.ChatClient;
66
import org.springframework.ai.chat.prompt.PromptTemplate;
77
import org.springframework.ai.document.Document;
88
import org.springframework.ai.vectorstore.SearchRequest;
99
import org.springframework.ai.vectorstore.VectorStore;
1010
import org.springframework.beans.factory.annotation.Value;
1111
import org.springframework.core.io.Resource;
12+
import org.springframework.util.CollectionUtils;
1213

1314
public class ChatService {
1415

@@ -24,20 +25,23 @@ public ChatService(ChatClient chatClient, VectorStore vectorStore) {
2425
}
2526

2627
public String chat(ChatRequest request) {
27-
var documents = findDocuments(request.message());
28+
var documents = findDocuments(request.input());
2829
var prompt = new PromptTemplate(promptRag).create(
29-
Map.of("query", request.message(),
30+
Map.of("query", request.input(),
3031
"documents", documents)
3132
);
32-
return chatClient.call(prompt).getResult().getOutput().getContent();
33+
return chatClient.prompt(prompt).call().content();
3334
}
3435

3536
private String findDocuments(String query) {
3637
var docs = vectorStore.similaritySearch(
37-
SearchRequest.query(query)
38-
.withSimilarityThresholdAll()
39-
.withTopK(3));
40-
return docs.stream().map(Document::getContent)
38+
SearchRequest.builder().query(query)
39+
.similarityThresholdAll()
40+
.topK(3).build());
41+
if (CollectionUtils.isEmpty(docs)) {
42+
return "";
43+
}
44+
return docs.stream().map(Document::getText)
4145
.collect(Collectors.joining("\r\n\r\n"));
4246
}
4347
}

src/main/java/cc/vividcode/ai/naiverag/etl/EtlController.java renamed to src/main/java/com/javaaidev/naiverag/etl/EtlController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.vividcode.ai.naiverag.etl;
1+
package com.javaaidev.naiverag.etl;
22

33
import org.springframework.http.ResponseEntity;
44
import org.springframework.web.bind.annotation.PostMapping;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.javaaidev.naiverag.etl;
2+
3+
import org.springframework.ai.transformer.splitter.TextSplitter;
4+
import org.springframework.ai.vectorstore.VectorStore;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
@Configuration
9+
public class EtlModuleConfiguration {
10+
11+
@Bean
12+
public TextSplitter textSplitter() {
13+
return new RecursiveTextSplitter();
14+
}
15+
16+
@Bean
17+
public EtlService etlService(TextSplitter textSplitter,
18+
VectorStore vectorStore) {
19+
return new EtlService(textSplitter, vectorStore);
20+
}
21+
}

src/main/java/cc/vividcode/ai/naiverag/etl/EtlService.java renamed to src/main/java/com/javaaidev/naiverag/etl/EtlService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.vividcode.ai.naiverag.etl;
1+
package com.javaaidev.naiverag.etl;
22

33
import java.util.concurrent.ExecutorService;
44
import java.util.concurrent.Executors;

src/main/java/cc/vividcode/ai/naiverag/etl/EtlTask.java renamed to src/main/java/com/javaaidev/naiverag/etl/EtlTask.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
package cc.vividcode.ai.naiverag.etl;
1+
package com.javaaidev.naiverag.etl;
22

3+
import java.util.List;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
36
import org.springframework.ai.document.DocumentTransformer;
47
import org.springframework.ai.document.DocumentWriter;
58

@@ -9,6 +12,8 @@ public class EtlTask implements Runnable {
912
private final DocumentTransformer documentTransformer;
1013
private final DocumentWriter documentWriter;
1114

15+
private static final Logger LOGGER = LoggerFactory.getLogger(EtlTask.class);
16+
1217
public EtlTask(String webPageUrl, DocumentTransformer documentTransformer,
1318
DocumentWriter documentWriter) {
1419
this.webPageUrl = webPageUrl;
@@ -18,7 +23,16 @@ public EtlTask(String webPageUrl, DocumentTransformer documentTransformer,
1823

1924
@Override
2025
public void run() {
26+
LOGGER.info("Load web page: {}", webPageUrl);
2127
var reader = new WebPageReader(webPageUrl);
22-
documentWriter.accept(documentTransformer.apply(reader.get()));
28+
var docs = documentTransformer.apply(reader.get());
29+
LOGGER.info("{} docs to store", docs.size());
30+
var index = 0;
31+
for (var doc : docs) {
32+
LOGGER.info("Save doc #{}", index + 1);
33+
documentWriter.accept(List.of(doc));
34+
index++;
35+
}
36+
LOGGER.info("Imported documents");
2337
}
2438
}

src/main/java/cc/vividcode/ai/naiverag/etl/RecursiveTextSplitter.java renamed to src/main/java/com/javaaidev/naiverag/etl/RecursiveTextSplitter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.vividcode.ai.naiverag.etl;
1+
package com.javaaidev.naiverag.etl;
22

33
import dev.langchain4j.data.document.Document;
44
import dev.langchain4j.data.document.splitter.DocumentSplitters;
@@ -10,7 +10,7 @@ public class RecursiveTextSplitter extends TextSplitter {
1010

1111
@Override
1212
protected List<String> splitText(String text) {
13-
var splitter = DocumentSplitters.recursive(200, 20);
13+
var splitter = DocumentSplitters.recursive(500, 100);
1414
return splitter.split(new Document(text))
1515
.stream()
1616
.map(TextSegment::text)

src/main/java/cc/vividcode/ai/naiverag/etl/WebPageLoadRequest.java renamed to src/main/java/com/javaaidev/naiverag/etl/WebPageLoadRequest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.vividcode.ai.naiverag.etl;
1+
package com.javaaidev.naiverag.etl;
22

33
public record WebPageLoadRequest(String url) {
44

0 commit comments

Comments
 (0)