在 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 跑起來、能被操作。
在下一篇,我們要讓它真正「開始學習文字」!