在 Day24 我們認識了 RAG 的概念與流程,
今天我們正式進入實作,
先從最基礎但最重要的一步開始:
啟動 Qdrant 並建立自己的向量資料庫 Collection。
Qdrant 是一個專門為 AI 語意搜尋(Vector Search)打造的資料庫。
它可以儲存文字、圖片、或其他內容的「向量(vector)」,
讓模型能以語意距離(例如 cosine similarity)搜尋最相關的資料。
📦 簡單理解:
Qdrant 就是你的 AI 的「長期記憶空間」。
如果你是第一次使用 Qdrant,可以用 Docker 一鍵啟動:
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant
6333:HTTP REST API 介面6334:gRPC 高效通訊介面(Spring 會用這個)打開瀏覽器輸入:
http://localhost:6333/dashboard
就能看到 Qdrant 的管理介面,
會顯示目前的 collections、文件數量與索引狀態。
pom.xml)<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Qdrant Vector Store Starter -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-vector-store-qdrant</artifactId>
    </dependency>
</dependencies>
Spring 不會自動建立 Qdrant Client,
我們自己配置 gRPC Client 方便連線:
@Configuration
public class QdrantConfig {
    @Bean(name = "QdrantClient")
    public QdrantClient qdrantClient () {
        return new QdrantClient(
                QdrantGrpcClient
                        .newBuilder("localhost", 6334, false)
                        .build());
    }
}
這樣我們就能在 Service 中直接注入 QdrantClient 使用。
接著建立一個可以:
的 API。
這樣我們能自由管理不同任務的向量儲存空間。
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/rag/collection")
@Slf4j
public class CollectionController {
    private final CollectionService collectionService;
    /** 建立 Collection */
    @PostMapping("/add")
    public ResponseEntity<BaseResponse> addCollection(@RequestBody CollectionRequest request) {
        return ResponseEntity.ok(collectionService.addCollection(request));
    }
    /** 刪除 Collection */
    @DeleteMapping("/delete")
    public ResponseEntity<BaseResponse> deleteCollection(@RequestBody CollectionRequest request) {
        return ResponseEntity.ok(collectionService.deleteCollection(request));
    }
}
@Slf4j
@Service
@RequiredArgsConstructor
public class CollectionImp implements CollectionService {
    private final QdrantClient qdrantClient;
    @Override
    public BaseResponse addCollection(CollectionRequest request) {
        try {
            qdrantClient.createCollectionAsync(request.getCollectionName(),
                    Collections.VectorParams.newBuilder()
                            .setDistance(Collections.Distance.Cosine)
                            .setSize(1024) // 向量維度
                            .build());
            return BaseResponse.builder().code("0000").msg("Success").build();
        } catch (Exception e) {
            return BaseResponse.builder().code("1111").msg("Fail").data(e.getMessage()).build();
        }
    }
    @Override
    public BaseResponse deleteCollection(CollectionRequest request) {
        try {
            qdrantClient.deleteCollectionAsync(request.getCollectionName());
            return BaseResponse.builder().code("0000").msg("Success").build();
        } catch (Exception e) {
            return BaseResponse.builder().code("1111").msg("Fail").data(e.getMessage()).build();
        }
    }
}
@Data
public class CollectionRequest {
    @JsonProperty("Collection_Name")
    private String collectionName;
    @JsonProperty("Collection_Size")
    private Integer collectionSize;
}



---
打開 http://localhost:6333/dashboard,
你會看到剛剛建立的 Collection 名稱。
到這裡為止,我們已經擁有一個可用的向量儲存空間,
接下來的步驟就是「轉成向量」存進去。
| 模組 | 功能 | 
|---|---|
| Qdrant | 儲存與搜尋語意向量 | 
| QdrantClient (gRPC) | 與伺服器通訊、建立 / 刪除 collections | 
| Spring Boot | 提供 REST 管理接口 | 
這一篇我們讓 Qdrant 跑起來、能被操作。
在下一篇,我們要讓它真正「開始學習文字」!