Solon v3.6.0

solon-ai-repo-mysql

</> markdown

此插件,由社区成员(小奶奶花生米)贡献

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-repo-mysql</artifactId>
</dependency>

1、描述

solon-ai 的主要扩展插件,提供 MySqlRepository 知识库。更多可参考 《教程 / Solon AI 开发》

建议:MySql 8.0+

2、构建示例

使用 MySqlRepository 时,需要嵌入模型做为支持,同时要添加用于查询的索引声明。

solon.ai.embed:
  bgem3:
    apiUrl: "http://127.0.0.1:11434/api/embed" # 使用完整地址(而不是 api_base)
    provider: "ollama" # 使用 ollama 服务时,需要配置 provider
    model: "bge-m3:latest"
    
solon.dataSources:
  db1:
    dataSourceClassName: "com.zaxxer.hikari.HikariDataSource"
      jdbcUrl: jdbc:mysql://localhost:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
     driverClassName: com.mysql.cj.jdbc.Driver
     username: root
     password: 123456

开始构建

@Configuration
public class DemoConfig {
    //构建向量模型
    @Bean
    public EmbeddingModel embeddingModel(@Inject("${solon.ai.embed.bgem3}") EmbeddingConfig config) {
        return EmbeddingModel.of(config).build();
    }
    
    //构建知识库 // db1 由配置 solon.dataSources 自动构建(名字按需取)
    @Bean
    public OpenSearchRepository repository(EmbeddingModel embeddingModel, @Inject("db1") DataSource ds){
        //创建元数据字段定义,用于构建索引(按需)
        List<MetadataField> metadataFields = new ArrayList<>();
        metadataFields.add(MetadataField.text("title"));
        metadataFields.add(MetadataField.text("category"));
        metadataFields.add(MetadataField.numeric("price"));
        metadataFields.add(MetadataField.numeric("stock"));
        
        return MySqlRepository.builder(embeddingModel, ds)
                .tableName("test_documents")
                .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);
    }
}