solon-ai-repo-elasticsearch
此插件,由社区成员(小奶奶花生米)贡献
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-ai-repo-elasticsearch</artifactId>
</dependency>
1、描述
solon-ai 的主要扩展插件,提供 ElasticsearchRepository 知识库。更多可参考 《教程 / Solon AI 开发》
2、构建示例
使用 ElasticsearchRepository 时,需要嵌入模型做为支持,同时要添加用于查询的索引申明。
solon.ai.embed:
bgem3:
apiUrl: "http://127.0.0.1:11434/api/embed" # 使用完整地址(而不是 api_base)
provider: "ollama" # 使用 ollama 服务时,需要配置 provider
model: "bge-m3:latest"
solon.ai.repo:
elasticsearch:
url: "http://localhost:9200" # 参考 client 需要的参数配置
username: "xxx"
password: "yyy"
开始构建
@Configuration
public class DemoConfig {
//构建向量模型
@Bean
public EmbeddingModel embeddingModel(@Inject("${solon.ai.embed.bgem3}") EmbeddingConfig config) {
return EmbeddingModel.of(config).build();
}
@Bean
public RestHighLevelClient client(@Inject("${solon.ai.repo.elasticsearch}") Props props) {
URI url = URI.create(props.get("url"));
String username = props.get("username");
String password = props.get("password");
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder builder = RestClient.builder(new HttpHost(url.getHost(), url.getPort(), url.getScheme()))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
return new RestHighLevelClient(builder);
}
//构建知识库
@Bean
public ElasticsearchRepository repository(EmbeddingModel embeddingModel, RestHighLevelClient client){
//创建元数据字段定义,用于构建索引(按需)
List<MetadataField> metadataFields = new ArrayList<>();
metadataFields.add(MetadataField.keyword("category"));
metadataFields.add(MetadataField.numeric("priority"));
metadataFields.add(MetadataField.keyword("title"));
metadataFields.add(MetadataField.numeric("year"));
return ElasticsearchRepository.builder(embeddingModel, client)
.metadataFields(metadataFields)
.build();
}
}
3、应用效果
@Component
public class DemoService {
//可使用统一的 RepositoryStorable 接口注入
@Inject
RepositoryStorable repository;
//添加资源
publiv void addDocument(List<Document> docs) {
repository.insert(docs);
}
//查资资料
publiv List<Document> findDocument(String query) {
//参考 solon-expression 语法。例如:price > 12 AND category == 'book'
return repository.search(query);
}
}