85 lines
3.0 KiB
Java
Raw Normal View History

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;
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;
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;
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 方式创建
*/
@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) {
return new OllamaApi(baseUrl);
}
/**
2025-07-29 13:18:59 +08:00
* 对话模型控制器里通过 OllamaOptions 指定具体 chat 模型 deepseek-r1:1.5b
*/
@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 13:18:59 +08:00
* 文本拆分器基于 Token 切分
*/
@Bean
public TokenTextSplitter tokenTextSplitter() {
return new TokenTextSplitter();
}
/**
2025-07-29 13:18:59 +08:00
* EmbeddingModelOllama使用配置项 spring.ai.rag.embed 指定 embedding 模型 nomic-embed-text
*/
@Bean
2025-07-29 13:18:59 +08:00
@Primary
public EmbeddingModel embeddingModel(
@Value("${spring.ai.rag.embed}") String embedModel,
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 13:18:59 +08:00
* 简单内存向量存储in-memory
*/
@Bean
2025-07-29 13:18:59 +08:00
public SimpleVectorStore vectorStore(EmbeddingModel embeddingModel) {
return SimpleVectorStore.builder(embeddingModel).build();
}
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();
}
}