2025-07-29 10:03:49 +08:00
|
|
|
|
package edu.whut.config;
|
|
|
|
|
|
2025-07-29 13:18:59 +08:00
|
|
|
|
import org.springframework.ai.embedding.EmbeddingModel;
|
|
|
|
|
import org.springframework.ai.ollama.OllamaChatModel;
|
|
|
|
|
import org.springframework.ai.ollama.OllamaEmbeddingModel;
|
2025-07-29 10:03:49 +08:00
|
|
|
|
import org.springframework.ai.ollama.api.OllamaApi;
|
|
|
|
|
import org.springframework.ai.ollama.api.OllamaOptions;
|
|
|
|
|
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
|
|
|
|
|
import org.springframework.ai.vectorstore.SimpleVectorStore;
|
2025-07-29 13:18:59 +08:00
|
|
|
|
import org.springframework.ai.vectorstore.pgvector.PgVectorStore;
|
2025-07-29 10:03:49 +08:00
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
2025-07-29 13:18:59 +08:00
|
|
|
|
import org.springframework.context.annotation.Primary;
|
2025-07-29 10:03:49 +08:00
|
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
|
|
|
|
|
|
|
/**
|
2025-07-29 13:18:59 +08:00
|
|
|
|
* 配置 Ollama 客户端、Embedding 模型、向量存储和文本拆分器等 Bean
|
|
|
|
|
* 注意(1.0.0-M6):
|
|
|
|
|
* - 不再使用 OllamaChatClient,改为 OllamaChatModel
|
|
|
|
|
* - Embedding 使用 EmbeddingModel 接口 + OllamaEmbeddingModel
|
|
|
|
|
* - PgVectorStore 与 SimpleVectorStore 使用 builder 方式创建
|
2025-07-29 10:03:49 +08:00
|
|
|
|
*/
|
|
|
|
|
@Configuration
|
|
|
|
|
public class OllamaConfig {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建 Ollama API 客户端,负责与 Ollama 服务的基础通信
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
2025-07-29 13:18:59 +08:00
|
|
|
|
public OllamaApi ollamaApi(@Value("${spring.ai.ollama.base-url}") String baseUrl) {
|
2025-07-29 10:03:49 +08:00
|
|
|
|
return new OllamaApi(baseUrl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-07-29 13:18:59 +08:00
|
|
|
|
* 对话模型;控制器里通过 OllamaOptions 指定具体 chat 模型(如 deepseek-r1:1.5b)
|
2025-07-29 10:03:49 +08:00
|
|
|
|
*/
|
|
|
|
|
@Bean
|
2025-07-29 13:18:59 +08:00
|
|
|
|
public OllamaChatModel ollamaChatModel(OllamaApi ollamaApi) {
|
|
|
|
|
// 如需设置默认对话模型,可在这里 .defaultOptions(OllamaOptions.builder().model("xxx").build())
|
|
|
|
|
return OllamaChatModel.builder()
|
|
|
|
|
.ollamaApi(ollamaApi)
|
|
|
|
|
.build();
|
2025-07-29 10:03:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-07-29 13:18:59 +08:00
|
|
|
|
* 文本拆分器:基于 Token 切分
|
2025-07-29 10:03:49 +08:00
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public TokenTextSplitter tokenTextSplitter() {
|
|
|
|
|
return new TokenTextSplitter();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-07-29 13:18:59 +08:00
|
|
|
|
* EmbeddingModel(Ollama):使用配置项 spring.ai.rag.embed 指定 embedding 模型,如 nomic-embed-text
|
2025-07-29 10:03:49 +08:00
|
|
|
|
*/
|
|
|
|
|
@Bean
|
2025-07-29 13:18:59 +08:00
|
|
|
|
@Primary
|
|
|
|
|
public EmbeddingModel embeddingModel(
|
|
|
|
|
@Value("${spring.ai.rag.embed}") String embedModel,
|
2025-07-29 10:03:49 +08:00
|
|
|
|
OllamaApi ollamaApi) {
|
2025-07-29 13:18:59 +08:00
|
|
|
|
return OllamaEmbeddingModel.builder()
|
|
|
|
|
.ollamaApi(ollamaApi)
|
|
|
|
|
.defaultOptions(OllamaOptions.builder().model(embedModel).build())
|
|
|
|
|
.build();
|
2025-07-29 10:03:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-07-29 13:18:59 +08:00
|
|
|
|
* 简单内存向量存储(in-memory)
|
2025-07-29 10:03:49 +08:00
|
|
|
|
*/
|
|
|
|
|
@Bean
|
2025-07-29 13:18:59 +08:00
|
|
|
|
public SimpleVectorStore vectorStore(EmbeddingModel embeddingModel) {
|
|
|
|
|
return SimpleVectorStore.builder(embeddingModel).build();
|
2025-07-29 10:03:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-29 13:18:59 +08:00
|
|
|
|
/**
|
|
|
|
|
* 基于 PostgreSQL pgvector 的持久化向量存储
|
|
|
|
|
* 如需自定义表名可追加 .vectorTableName("your_table")
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public PgVectorStore pgVectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel embeddingModel) {
|
|
|
|
|
return PgVectorStore.builder(jdbcTemplate, embeddingModel).build();
|
|
|
|
|
}
|
2025-07-29 10:03:49 +08:00
|
|
|
|
}
|