查询路由,会根据用户的问题,路由到不同的存储类型中做检索,比如关系型数据库,图数据库,以及知识库。 但是,模型存在幻觉,有可能出现路由错的情况,比如应该路由到知识库,但是路由到了关系型数据库。 这种情况,我们通过兜底策略来解决,即我们在KnowEngineSqlDatabaseContentRetriever和KnowEngineNeo4jContentRetriever中都做了兜底。
@Override
public List<Content> retrieve(Query query) {
List<Content> results;
try {
...
results = sqlDatabaseContentRetriever.retrieve(query);
} catch (Exception e) {
log.warn("SQL 检索异常,降级使用知识库检索, query: {}", query.text(), e);
return fallbackRetriever.retrieve(query);
}
if (results == null || results.isEmpty() || isSqlResultEmpty(results)) {
log.info("SQL 检索结果为空,降级使用知识库检索, query: {}", query.text());
return fallbackRetriever.retrieve(query);
}
....
}
即检索报错、或者检索结果为空时,再走知识库做一次检索。尽量减少拒答的情况。