# Spring AI Demo > ๐Ÿค– ไธ€ไธช็ฎ€ๆดไผ˜้›…็š„ Spring AI ๅฏน่ฏๆผ”็คบ้กน็›ฎ๏ผŒๅŸบไบŽ Spring Boot 3.2.0 ไธŽ Spring AI 1.0.0-M3 ๆž„ๅปบ๏ผŒๆ”ฏๆŒๆตๅผๅ“ๅบ”ใ€Markdown ๆธฒๆŸ“ไธŽ RAG ๆ™บ่ƒฝ้—ฎ็ญ”ใ€‚ [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2.0-brightgreen)](https://spring.io/projects/spring-boot) [![Spring AI](https://img.shields.io/badge/Spring%20AI-1.0.0--M3-blue)](https://spring.io/projects/spring-ai) [![JDK](https://img.shields.io/badge/JDK-17%2B-orange)](https://openjdk.org/) [![License](https://img.shields.io/badge/License-MIT-yellow)](LICENSE) ## โœจ ็‰นๆ€ง - ๐ŸŒ **AI ๆ™บ่ƒฝๅฏน่ฏ** - ๅŸบไบŽ Ollama ็š„่‡ช็„ถ่ฏญ่จ€ไบคไบ’ - ๐Ÿ“ก **ๆตๅผๅ“ๅบ”** - ๅฎžๆ—ถ้€ๅญ—่พ“ๅ‡บ๏ผŒไฝ“้ชŒๆต็•… - ๐Ÿ“ **Markdown ๆ”ฏๆŒ** - ๅฎŒๆ•ดๆธฒๆŸ“ไปฃ็ ๅ—ใ€่กจๆ ผใ€ๅˆ—่กจ็ญ‰ๆ ผๅผ - ๐Ÿ‘จโ€๐Ÿ’ป **ไปฃ็ ้ซ˜ไบฎ** - Highlight.js ่‡ชๅŠจ่ฏญ่จ€ๆฃ€ๆต‹ไธŽ่ฏญๆณ•็€่‰ฒ - ๐Ÿ“š **RAG ๆ™บ่ƒฝ้—ฎ็ญ”** - ๅŸบไบŽๅ‘้‡ๆฃ€็ดข็š„ไธŠไธ‹ๆ–‡ๆ„Ÿ็Ÿฅๅ›ž็ญ” - ๐Ÿ“ค **PDF ๆ–‡ไปถไธŠไผ ** - PDF ๆ–‡ๆœฌๆๅ–ไธŽๅ‘้‡ๅŒ–ๅญ˜ๅ‚จ - ๐Ÿ“Š **ไธŠไผ ่ฟ›ๅบฆๆต** - ๅฎžๆ—ถไธŠไผ ่ฟ›ๅบฆๅ้ฆˆ - ๐Ÿ” **่ฏญไน‰ๆฃ€็ดข** - Milvus ๅ‘้‡ๆ•ฐๆฎๅบ“็›ธไผผๅบฆๆœ็ดข - ๐Ÿ”— **ๅผ•็”จๆบฏๆบ** - ๅ›ž็ญ”้™„ๅธฆๆ–‡ๆกฃๆฅๆบๅผ•็”จ - ๐Ÿ—ƒ๏ธ **ๅ‘้‡ๆ•ฐๆฎๅบ“** - Milvus ๅˆ†ๅธƒๅผๅ‘้‡ๆ•ฐๆฎๅบ“ - ๐Ÿ” **Embedding ๆœๅŠก** - SiliconFlow BAAI/bge-m3 - ๐ŸŒ **CORS ่ทจๅŸŸ** - ๆ”ฏๆŒๅคš็ซฏ่ฎฟ้—ฎ - ๐ŸŽจ **็ฒพ็พŽ็•Œ้ข** - ๆทฑ่‰ฒไธป้ข˜ๅ“ๅบ”ๅผ่ฎพ่ฎก ## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ ### ็Žฏๅขƒ่ฆๆฑ‚ - JDK 17+ - Maven 3.8+ - [Ollama](https://ollama.ai/) ๆœฌๅœฐๆœๅŠก - Milvus ๅ‘้‡ๆ•ฐๆฎๅบ“ ### 1. ๅฎ‰่ฃ… Ollama ```bash # macOS/Linux curl -fsSL https://ollama.ai/install.sh | sh # ๆ‹‰ๅ–ๆจกๅž‹ ollama pull gpt-oss:120b-cloud # ๅฏๅŠจๆœๅŠก (้ป˜่ฎค็ซฏๅฃ 11434) ollama serve ``` ### 2. ๅฏๅŠจ้กน็›ฎ ```bash mvn spring-boot:run ``` ### 3. ่ฎฟ้—ฎๅบ”็”จ - **Web ็•Œ้ข**: http://localhost:8080 - **ๅฅๅบทๆฃ€ๆŸฅ**: http://localhost:8080/api/chat/test ## ๐Ÿ”ง ๆŠ€ๆœฏๆ ˆ ### ๅŽ็ซฏ | ็ป„ไปถ | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | |:---|:---|:---| | ๅŸบ็ก€ๆก†ๆžถ | Spring Boot | 3.2.0 | | AI ๆก†ๆžถ | Spring AI | 1.0.0-M3 | | AI ๆจกๅž‹ | OpenAI/Ollama | - | | Embedding | SiliconFlow BAAI/bge-m3 | - | | ๅ‘้‡ๆ•ฐๆฎๅบ“ | Milvus | 2.3.4 | | PDF ๅค„็† | Apache PDFBox | 2.0.29 | | ๆ–‡ไปถไธŠไผ  | Commons FileUpload | 1.5 | | ๅ“ๅบ”ๅผ็ผ–็จ‹ | Spring WebFlux | 3.2.0 | ### ๅ‰็ซฏ | ๆŠ€ๆœฏ | ็”จ้€” | |:---|:---| | HTML5 + CSS3 | ้กต้ข็ป“ๆž„ไธŽๆ ทๅผ | | Marked.js | Markdown ่งฃๆžๆธฒๆŸ“ | | Highlight.js | ไปฃ็ ่ฏญๆณ•้ซ˜ไบฎ | ## ๐Ÿ“ ้กน็›ฎ็ป“ๆž„ ``` springAiDemo/ โ”œโ”€โ”€ src/main/java/com/demo/ โ”‚ โ”œโ”€โ”€ MyApplication.java # Spring Boot ๅฏๅŠจๅ…ฅๅฃ โ”‚ โ”œโ”€โ”€ config/ โ”‚ โ”‚ โ”œโ”€โ”€ CorsConfig.java # CORS ่ทจๅŸŸ้…็ฝฎ โ”‚ โ”‚ โ””โ”€โ”€ RagConfig.java # RAG ้…็ฝฎ็ฑป โ”‚ โ”œโ”€โ”€ controller/ โ”‚ โ”‚ โ”œโ”€โ”€ ChatController.java # AI ่Šๅคฉ API โ”‚ โ”‚ โ””โ”€โ”€ DocumentController.java # ๆ–‡ๆกฃๅค„็† API โ”‚ โ”œโ”€โ”€ dto/ โ”‚ โ”‚ โ”œโ”€โ”€ ApiResponse.java # ็ปŸไธ€ๅ“ๅบ”ๅฐ่ฃ… โ”‚ โ”‚ โ”œโ”€โ”€ ChatRequest.java # ่Šๅคฉ่ฏทๆฑ‚ DTO โ”‚ โ”‚ โ”œโ”€โ”€ ChatResponse.java # ่Šๅคฉๅ“ๅบ” DTO โ”‚ โ”‚ โ”œโ”€โ”€ FileUploadProgress.java # ไธŠไผ ่ฟ›ๅบฆ DTO โ”‚ โ”‚ โ””โ”€โ”€ FileUploadResponse.java # ไธŠไผ ๅ“ๅบ” DTO โ”‚ โ””โ”€โ”€ service/ โ”‚ โ”œโ”€โ”€ ChatService.java # RAG ่ŠๅคฉๆœๅŠก โ”‚ โ””โ”€โ”€ DocumentService.java # ๆ–‡ๆกฃๅค„็†ๆœๅŠก โ”œโ”€โ”€ data/ โ”‚ โ””โ”€โ”€ doris_intro.md # RAG ็คบไพ‹ๆ–‡ๆกฃ โ””โ”€โ”€ src/main/resources/ โ”œโ”€โ”€ application.yaml # ๅบ”็”จ้…็ฝฎ โ””โ”€โ”€ static/ # ๅ‰็ซฏ่ต„ๆบ ``` ## ๐Ÿ’ฌ API ๆ–‡ๆกฃ ### ่ŠๅคฉๆŽฅๅฃ | ๆ–นๆณ• | ็ซฏ็‚น | ๆ่ฟฐ | ๅ‚ๆ•ฐ/Body | |:---|:---|:---|:---| | GET | `/api/chat/test` | ๅฅๅบทๆฃ€ๆŸฅ | - | | GET | `/api/chat/ai` | ๆตๅผ AI ๅฏน่ฏ | `msg` | | POST | `/api/chat` | RAG ๆ™บ่ƒฝ้—ฎ็ญ” | `{ "question": "...", "topK": 10 }` | | POST | `/api/chat/stream` | ๆตๅผ RAG ้—ฎ็ญ” | `{ "question": "..." }` (SSE) | ### ๆ–‡ๆกฃๆŽฅๅฃ | ๆ–นๆณ• | ็ซฏ็‚น | ๆ่ฟฐ | ๅ‚ๆ•ฐ | |:---|:---|:---|:---| | POST | `/api/documents/import` | ๅฏผๅ…ฅ RAG ๆ–‡ๆกฃ | - | | POST | `/api/documents/upload` | ไธŠไผ  PDF ๆ–‡ไปถ | `file` (multipart) | | POST | `/api/documents/upload/stream` | ไธŠไผ  PDF (ๅธฆ่ฟ›ๅบฆ) | `file` (multipart) | ### ่ฏทๆฑ‚็คบไพ‹ **RAG ๆ™บ่ƒฝ้—ฎ็ญ”๏ผš** ```bash curl -X POST http://localhost:8080/api/chat \ -H "Content-Type: application/json" \ -d '{"question": "Apache Doris ๆ˜ฏไป€ไนˆ๏ผŸ"}' ``` **ๆตๅผ RAG ้—ฎ็ญ” (SSE)๏ผš** ```bash curl -X POST http://localhost:8080/api/chat/stream \ -H "Content-Type: application/json" \ -d '{"question": "Apache Doris ๆ€ง่ƒฝๅฆ‚ไฝ•๏ผŸ"}' ``` **PDF ๆ–‡ไปถไธŠไผ ๏ผš** ```bash curl -X POST http://localhost:8080/api/documents/upload \ -F "file=@/path/to/document.pdf" ``` **ๅฏผๅ…ฅ RAG ๆ–‡ๆกฃ๏ผš** ```bash curl -X POST http://localhost:8080/api/documents/import ``` ### ๅ“ๅบ”ๆ ผๅผ **POST /api/chat ๅ“ๅบ”๏ผš** ```json { "code": 200, "message": "success", "data": { "answer": "Apache Doris ๆ˜ฏไธ€ไธช...", "references": ["data/doris_intro.md"], "timestamp": 1713000000000 } } ``` **POST /api/documents/upload/stream ๅ“ๅบ” (SSE)๏ผš** ```json {"percent":0,"status":"STARTING","message":"ๅผ€ๅง‹ไธŠไผ ..."} {"percent":30,"status":"EXTRACTING","message":"ๆญฃๅœจๆๅ–ๆ–‡ๆœฌ..."} {"percent":60,"status":"PROCESSING","message":"ๆญฃๅœจๅ‘้‡ๅŒ–..."} {"percent":100,"status":"COMPLETED","message":"ไธŠไผ ๅฎŒๆˆ"} ``` ## ๐Ÿ“š RAG ๆ–‡ๆกฃ้—ฎ็ญ” ### ๅทฅไฝœๅŽŸ็† ``` ็”จๆˆท้—ฎ้ข˜ โ†’ Embedding โ†’ ๅ‘้‡ๆฃ€็ดข โ†’ ๆž„ๅปบไธŠไธ‹ๆ–‡ โ†’ LLM ็”Ÿๆˆๅ›ž็ญ” โ†’ ่ฟ”ๅ›ž็ญ”ๆกˆ+ๅผ•็”จ ``` ### ไฝฟ็”จๆญฅ้ชค 1. **ๆ–นๅผไธ€**๏ผšๅฐ† `.md` / `.txt` ๆ–‡ๆกฃๆ”พๅ…ฅ `data/` ็›ฎๅฝ•๏ผŒ่ฐƒ็”จๅฏผๅ…ฅๆŽฅๅฃ 2. **ๆ–นๅผไบŒ**๏ผš็›ดๆŽฅไธŠไผ  PDF ๆ–‡ไปถ๏ผŒ็ณป็ปŸ่‡ชๅŠจๆๅ–ๆ–‡ๆœฌๅนถๅ‘้‡ๅŒ– 3. ้€š่ฟ‡ POST `/api/chat` ๆˆ–ๆตๅผ `/api/chat/stream` ๆ้—ฎ ## ๐Ÿ› ๏ธ ้…็ฝฎ่ฏดๆ˜Ž ### CORS ่ทจๅŸŸ้…็ฝฎ ```yaml cors: allowed-origins: http://localhost:8081,http://localhost:5173 allowed-methods: GET,POST,PUT,DELETE,OPTIONS ``` ### ๆ–‡ไปถไธŠไผ ้…็ฝฎ ```yaml spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB ``` ### Embedding ้…็ฝฎ ```yaml spring: ai: openai: embedding: api-key: your-siliconflow-api-key base-url: https://api.siliconflow.cn model: BAAI/bge-m3 dimensions: 1024 ``` ## ๐ŸŽฌ ๆžถๆž„ๅ›พ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Client โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚ โ”‚ โ”‚ Web UI โ”‚ โ”‚ POST /api/chat โ”‚โ”‚ โ”‚ โ”‚ (ๆตๅผ/้žๆตๅผ) โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ POST /api/chat/stream (SSE) โ”‚โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ChatController โ”‚ โ”‚ POST /api/chat โ†’ ChatService โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ VectorStore โ”‚ โ”‚ ChatClient โ”‚ โ”‚ (Milvus ่ฏญไน‰ๆฃ€็ดข) โ”‚ โ”‚ (Ollama LLM) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ## ๐Ÿ“– ๆ›ดๆ–ฐๆ—ฅๅฟ— ### v1.0.0 (2026-04-19) - ๐ŸŽ‰ ๅˆๅง‹็‰ˆๆœฌๅ‘ๅธƒ - ๆ”ฏๆŒๆตๅผ AI ๅฏน่ฏ - Markdown ๆธฒๆŸ“ไธŽไปฃ็ ้ซ˜ไบฎ - ๆทฑ่‰ฒไธป้ข˜ Web ็•Œ้ข ### v1.1.0 (2026-04-19) - โœจ ๆ–ฐๅขž RAG ๆ–‡ๆกฃ้—ฎ็ญ”ๅŠŸ่ƒฝ - โœจ ้…็ฝฎ SiliconFlow Embedding ๆœๅŠก - โœจ ้›†ๆˆ Milvus ๅ‘้‡ๆ•ฐๆฎๅบ“ ### v1.2.0 (2026-04-19) - โœจ ๆ–ฐๅขž POST /api/chat RAG ๆ™บ่ƒฝ้—ฎ็ญ”ๆŽฅๅฃ - โœจ ๆ–ฐๅขž ChatService RAG ๆ ธๅฟƒๆœๅŠก - โœจ ๆ–ฐๅขžๅผ•็”จๆบฏๆบๅŠŸ่ƒฝ ### v1.3.0 (2026-04-20) - โœจ ๆ–ฐๅขž POST /api/chat/stream ๆตๅผ RAG ้—ฎ็ญ”ๆŽฅๅฃ (SSE) - โœจ ๆ–ฐๅขž PDF ๆ–‡ไปถไธŠไผ ๆŽฅๅฃ (POST /api/documents/upload) - โœจ ๆ–ฐๅขžๅธฆ่ฟ›ๅบฆๆตๅผ PDF ไธŠไผ  (POST /api/documents/upload/stream) - โœจ ๆ–ฐๅขž CorsConfig ่ทจๅŸŸ้…็ฝฎ - โœจ embedding ๆจกๅž‹ๆ›ดๆ–ฐไธบ BAAI/bge-m3 - โœจ ChatRequest topK ้ป˜่ฎคๅ€ผ่ฐƒๆ•ดไธบ 10 - ๐Ÿ› ไฟฎๅคๆ–‡ไปถ้‡ๅคไธŠไผ ้—ฎ้ข˜ (MD5 ๅŽป้‡) ## ๐Ÿ“— License MIT ยฉ 2026 Spring AI Demo --- ๐Ÿš€ **Made with Spring AI**