diff --git a/pom.xml b/pom.xml
index b75e830..e693acd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,13 +106,41 @@
spring-boot-starter-webflux
+
net.sourceforge.tess4j
tess4j
${tess4j.version}
- compile
+
+
+ io.github.mymonstercat
+ rapidocr
+ 0.0.7
+
+
+
+ io.github.mymonstercat
+ rapidocr-onnx-platform
+ 0.0.7
+
+
+
+
+
+
+
+
+
+
+
+ commons-io
+ commons-io
+ 2.15.1
+
+
+
org.springframework.boot
spring-boot-starter-thymeleaf
@@ -335,12 +363,7 @@
${langchain4j.version}
-
-
- com.microsoft.onnxruntime
- onnxruntime
- 1.17.0
-
+
diff --git a/src/main/java/com/xly/agent/ErpAiAgent.java b/src/main/java/com/xly/agent/ErpAiAgent.java
index e120d7d..ba4f7d8 100644
--- a/src/main/java/com/xly/agent/ErpAiAgent.java
+++ b/src/main/java/com/xly/agent/ErpAiAgent.java
@@ -11,14 +11,14 @@ import dev.langchain4j.service.V;
*/
public interface ErpAiAgent {
@SystemMessage("""
- 1. 方法匹配:先精准拆解用户查询的核心业务意图,再自动匹配唯一符合用户问题的工具方法(MethodNo),禁止自创,规则如下;
- 1.1 匹配方法时,无需考虑工具描述(@TOOL)中 1.必填参数,2.选填参数,示例,parameters内容 四个部分的内容;
- 1.2 匹配方法时,只关注工具描述(@TOOL)中 “当用户” 和 “时,必须调用本工具”两个短语之间的内容;
- 1.3 调用工具前,不需要询问用户提供缺失的参数
- 2. 参数提取:提取该工具的全部参数,与描述完全一致,严格按标注类型赋值,规则如下:
- 2.1 数字无引号,为空时禁止赋值0;
- 2.2 如果有空格需要去掉空格后再提取。
- """)
+ 1. 方法匹配:先精准拆解用户查询的核心业务意图,再自动匹配唯一符合用户问题的工具方法(MethodNo),禁止自创,规则如下;
+ 1.1 匹配方法时,无需考虑工具描述(@TOOL)中 1.必填参数,2.选填参数,示例,parameters内容 四个部分的内容;
+ 1.2 匹配方法时,只关注工具描述(@TOOL)中 “当用户” 和 “时,必须调用本工具”两个短语之间的内容;
+ 1.3 调用工具前,不需要询问用户提供缺失的参数
+ 2. 参数提取:提取该工具的全部参数,与描述完全一致,严格按标注类型赋值,规则如下:
+ 2.1 数字无引号,为空时禁止赋值0;
+ 2.2 如果有空格需要去掉空格后再提取。
+ """)
@UserMessage("用户输入:{{userInput}}")
String chat(@MemoryId String userId, @V("userInput") String userInput);
@@ -27,16 +27,16 @@ public interface ErpAiAgent {
* 入参:用户问题、执行的SQL、表结构、JSON格式结果
*/
@SystemMessage("""
- 你是专业的业务数据分析师,严格遵循以下**通用规则**解释查询结果,适用于所有业务场景:
- 1. 解释风格:贴合业务场景,无任何SQL专业术语,用口语化、简洁的商业语言说明,避免技术词汇;
- 2. 数据准确:严格按照JSON执行结果解释,不夸大、不遗漏、不编造数据,数值与结果完全一致;
- 3. 输出格式:仅返回解释内容,不要列出ID,无多余标题、换行、符号,结果为空时直接返回“未查询到相关数据”
- 3.1. 所有数字格式必须以纯文本形式输出,严禁使用千分位分隔符(即不要出现逗号 ",")示例:正确写法是 1000000,错误写法是 1,000,000,即使数字很大,也请保持连续的数字串,不要打断。
- 3.2 所有日期请转换为 YYYY-MM-DD 格式(例如:2026-03-15),严禁包含时间部分(如小时、分钟、秒)(例如:2026-03-15 00:00:00),也不要包含时区信息。”
- 3.3. 金额,单价,数量 严禁使用千分位分隔符(即不要出现逗号 ",")示例:正确写法是 2400056,错误写法是 2,400,056 即使数字很大,也请保持连续的数字串,不要打断。
- 4. 长度控制:单条解释不超过150字,条理清晰,重点突出核心数据/趋势;
- 5. 禁止重复:不重复用户问题、不重复执行的SQL语句,仅针对结果做业务解读。
- """)
+ 你是专业的业务数据分析师,严格遵循以下**通用规则**解释查询结果,适用于所有业务场景:
+ 1. 解释风格:贴合业务场景,无任何SQL专业术语,用口语化、简洁的商业语言说明,避免技术词汇;
+ 2. 数据准确:严格按照JSON执行结果解释,不夸大、不遗漏、不编造数据,数值与结果完全一致;
+ 3. 输出格式:仅返回解释内容,不要列出ID,无多余标题、换行、符号,结果为空时直接返回“未查询到相关数据”
+ 3.1. 所有数字格式必须以纯文本形式输出,严禁使用千分位分隔符(即不要出现逗号 ",")示例:正确写法是 1000000,错误写法是 1,000,000,即使数字很大,也请保持连续的数字串,不要打断。
+ 3.2 所有日期请转换为 YYYY-MM-DD 格式(例如:2026-03-15),严禁包含时间部分(如小时、分钟、秒)(例如:2026-03-15 00:00:00),也不要包含时区信息。”
+ 3.3. 金额,单价,数量 严禁使用千分位分隔符(即不要出现逗号 ",")示例:正确写法是 2400056,错误写法是 2,400,056 即使数字很大,也请保持连续的数字串,不要打断。
+ 4. 长度控制:单条解释不超过150字,条理清晰,重点突出核心数据/趋势;
+ 5. 禁止重复:不重复用户问题、不重复执行的SQL语句,仅针对结果做业务解读。
+ """)
@UserMessage("""
【业务场景表结构信息】
表结构详情:{{tableStruct}}
@@ -57,119 +57,143 @@ public interface ErpAiAgent {
* 入参:用户问题、执行的SQL、表结构、JSON格式结果
*/
@SystemMessage("""
- 你是专业的业务数据分析师,请分析以下查询结果:
- 【用户问题】
- {{userInput}}
- 【数据字段说明】
- {{sMilvusFiledDescription}}
- 【查询结果数据(JSON格式)】
- {{result}}
- 【分析要求】
- 1. 解释风格:贴合业务场景,无任何SQL专业术语,用口语化、简洁的商业语言说明,避免技术词汇;
- 2. 数据准确:严格按照JSON执行结果解释,不夸大、不遗漏、不编造数据,数值与结果完全一致;
- 3. 输出格式:
- 3.1. 如果用户要求"表格形式展示",先输出简短文字说明,然后输出Markdown格式的表格
- 3.2. 如果用户未要求表格,仅返回解释内容,不要列出ID,无多余标题、换行、符号
- 3.3. 结果为空时直接返回"未查询到相关数据"
- 3.4. 所有数字格式必须以纯文本形式输出,严禁使用千分位分隔符(即不要出现逗号 ",")
- 3.5. 所有日期请转换为 YYYY-MM-DD 格式,严禁包含时间部分
- 4. 长度控制:单条解释不超过150字,条理清晰,重点突出核心数据/趋势;
- 5. 禁止重复:不重复用户问题、不重复执行的SQL语句,仅针对结果做业务解读。
- """)
+ 你是专业的业务数据分析师,请分析以下查询结果:
+ 【用户问题】
+ {{userInput}}
+ 【数据字段说明】
+ {{sMilvusFiledDescription}}
+ 【查询结果数据(JSON格式)】
+ {{result}}
+ 【分析要求】
+ 1. 解释风格:贴合业务场景,无任何SQL专业术语,用口语化、简洁的商业语言说明,避免技术词汇;
+ 2. 数据准确:严格按照JSON执行结果解释,不夸大、不遗漏、不编造数据,数值与结果完全一致;
+ 3. 输出格式:
+ 3.1. 如果用户要求"表格形式展示",先输出简短文字说明,然后输出Markdown格式的表格
+ 3.2. 如果用户未要求表格,仅返回解释内容,不要列出ID,无多余标题、换行、符号
+ 3.3. 结果为空时直接返回"未查询到相关数据"
+ 3.4. 所有数字格式必须以纯文本形式输出,严禁使用千分位分隔符(即不要出现逗号 ",")
+ 3.5. 所有日期请转换为 YYYY-MM-DD 格式,严禁包含时间部分
+ 4. 长度控制:单条解释不超过150字,条理清晰,重点突出核心数据/趋势;
+ 5. 禁止重复:不重复用户问题、不重复执行的SQL语句,仅针对结果做业务解读。
+ """)
@UserMessage("""
- 【用户查询】
- {{userInput}}
- 【字段说明】
- {{sMilvusFiledDescription}}
- 【查询结果】
- 用户原始查询:{{userInput}}
- 执行查询向量库后结果(JSON格式):{{result}}
- 请根据上述信息+通用规则,对查询结果做业务解释:
- """)
+ 【用户查询】
+ {{userInput}}
+ 【字段说明】
+ {{sMilvusFiledDescription}}
+ 【查询结果】
+ 用户原始查询:{{userInput}}
+ 执行查询向量库后结果(JSON格式):{{result}}
+ 请根据上述信息+通用规则,对查询结果做业务解释:
+ """)
String explainMilvusResult(@MemoryId String userId,
@V("userInput") String userInput,
@V("sMilvusFiledDescription") String sMilvusFiledDescription,
@V("result") String result);
- /**
- * AI路由判断接口
- * true: 走聚合查询(MySQL)
- * false: 走向量检索(Milvus)
- */
-// @SystemMessage("""
-// 你是一个智能查询路由专家,请根据用户需求判断应该使用哪种查询方式。
-//
-// 判断标准:
-// 1. 返回 true(聚合查询/MySQL)的场景:
-// - 需要计算统计指标:总数、总和、平均值、最大/最小值、占比
-// - 需要数据汇总:分组统计、排行榜、TopN
-// - 包含关键词:统计、求和、汇总、排名、平均、数量、总额、最高、最低、占比、分组、分析、趋势
-// - 示例:统计本月销售总额、查询销量前10的商品、各品类占比分析
-//
-// 2. 返回 false(向量检索/Milvus)的场景:
-// - 查询明细数据:XXX的销售订单明细、XXX的客户信息、具体内容详情
-// - 查找相似内容:根据语义查找相关文档、推荐相似商品
-// - 模糊匹配:不确定具体关键词,需要语义理解
-// - 内容检索:查找包含特定概念的文档
-// - 包含关键词:明细、详情、查询明细、查找、搜索、匹配、推荐、相似、相关、类似
-// - 示例:李留记的销售订单明细、查询关于人工智能的文档、找相似的图片
-//
-// 重要规则:
-// - 只返回 true 或 false,不要返回其他内容
-// - 不要解释,不要添加额外文字
-// - 如果用户要求"表格形式展示",返回 false(明细查询)
-// - 如果用户指定具体人名、具体对象,返回 false(明细查询)
-// """)
-// @UserMessage("用户需求:{{userInput}}")
@SystemMessage("""
- 你是一个智能查询路由专家。请根据【用户需求】,只返回 true 或 false
- - 如果用户需求包含以下关键词:统计、求和、汇总、排名、TopN、平均、数量、总额、最高、最低、占比、分组,则返回true
- - 如果用户需求属于模糊匹配、普通语义检索,查询明细,(例如:查询报价单明细,查询客户信息),则返回false
- - 查询明细数据:XXX的销售订单明细、XXX的客户信息、具体内容详情,则返回false
- - 模糊匹配:不确定具体关键词,需要语义理解,则返回false
+ 你是一个智能查询路由专家。请根据【用户需求】,只返回 true 或 false。
+
+ 【最高优先级规则 - 必须首先判断】
+ 如果用户需求包含以下任一关键词,**直接返回 false**,不再进行其他判断:
+ - 明细、详情、详细信息、详细内容、具体内容
+ - 查询...明细、...详情、...记录、...列表、...清单
+
+ 重要:只要出现以上关键词,说明用户需要的是明细数据查询,而非统计分析。
+
+ 【统计类关键词 - 仅在满足最高优先级规则后才判断】
+ 只有当用户需求不包含上述明细类关键词时,才检查是否包含以下关键词:
+ 统计、求和、汇总、排名、TopN、平均、数量、总额、最高、最低、占比、分组
+
+ - 如果包含,返回 true
+ - 否则返回 false
+
+ 【判断示例】
+ - \"查询中科精工集团的彩盒类产品的报价单明细\" → false(包含\"明细\")
+ - \"统计各产品销售额\" → true(包含\"统计\",且无明细关键词)
+ - \"查询客户张三信息\" → false(无统计关键词,无明细关键词)
+ - \"销售额排名前10的产品\" → true(包含\"排名\",且无明细关键词)
+ - \"查看销售订单明细\" → false(包含\"明细\")
""")
@UserMessage("""
- 【用户需求】
+ 【用户需求】
{{userInput}}
""")
Boolean routeQuery(@MemoryId String userId, @V("userInput") String userInput);
/**
- * 生成 Milvus 过滤条件
+ * 生成 Milvus 过滤条件(适配 Milvus v2.3.9)
*/
@SystemMessage("""
- MILVUS 标量过滤条件生成规则(严格遵守):
- 1. 语法规范:
- - 允许的操作符:==, !=, like
- - 逻辑组合:&& (AND), || (OR)
- - 所有字段都是字符串类型,值必须使用单引号包裹
- - 字符串中的单引号需要转义:'O''Reilly'
- 2. 可用字段(只能使用这些字段):
- - {{sMilvusFiled}}
- 字段说明:
- - {{sMilvusFiledDescription}}
- 3. 重要规则:
- - 只使用上述可用字段,不要创建新字段
- - 如果用户提到了文档类型(如"报价单"、"订单"等),但可用字段中没有类型字段,则忽略该条件
- - 只提取有明确值的字段条件
- 4. 生成规则:
- - 如果没有提取到任何具体条件,返回空字符串
- - 从用户输入中提取明确的字段条件
- - 识别模式:字段名 + 操作符 + 值
- - 示例:
- * "单据号 INV001" → sBillNo == 'INV001'
- * "客户编号 C001" → sCustomerNo == 'C001'
- * "销售人员张三" → sSalesManName == '张三'
- * "产品包含手机" → sProductStyle like '%手机%'
- 5. 输出格式:
- - 仅返回纯过滤条件,无任何解释、换行、备注
- - 单条件:sBillNo == 'INV001'
- - 多条件:(sBillNo == 'INV001' && sCustomerNo == 'C001')
- - 无条件:直接返回空字符串
- """)
- @UserMessage("""
+ MILVUS 标量过滤条件生成规则(严格遵守 - 当前版本 v2.3.9):
+
+ 【重要输出约束】
+ - 必须返回有效的 Milvus 过滤条件表达式
+ - 禁止返回 true 或 false
+ - 禁止返回空字符串以外的任何非表达式内容
+ - 无条件时只返回空字符串 ""
+
+ 1. 语法规范:
+ - 允许的操作符:==, !=, like
+ - 逻辑组合:&& (AND), || (OR)
+ - 所有字段都是字符串类型,值必须使用单引号包裹
+ - 字符串中的单引号需要转义:'O''Reilly'
+
+ 2. 【重要】Milvus v2.3.9 like 操作符限制:
+ - ✅ 支持:like '关键字%'(前缀匹配,以关键字开头)
+ - ❌ 不支持:like '%关键字%'(包含匹配)
+ - ❌ 不支持:like '%关键字'(后缀匹配)
+
+ 3. 可用字段(只能使用这些字段):
+ - {{sMilvusFiled}}
+ 字段说明:
+ - {{sMilvusFiledDescription}}
+
+ 4. 提取规则:
+ - 只使用上述可用字段,不要创建新字段
+ - 如果用户提到了文档类型(如"报价单"、"订单"等),但可用字段中没有类型字段,则忽略该条件
+
+ 【精确匹配规则】:
+ - 当用户提供明确值时:字段 == '值'
+ * 例如:"客户名称中科精工" → sCustomerName == '中科精工'
+ * 例如:"单据号 INV001" → sBillNo == 'INV001'
+
+ 5. 时间处理规则:
+ - 当前系统时间:{{sDataNow}}(格式:yyyy-MM-dd)
+ - 相对时间转换规则:
+ * "今天/今日" → 当天 00:00:00 到 23:59:59
+ * "昨天" → 前一天 00:00:00 到 23:59:59
+ * "本周" → 本周一 00:00:00 到本周日 23:59:59
+ * "本月" → 本月1日 00:00:00 到本月最后一天 23:59:59
+ * "本年" → 本年1月1日 00:00:00 到本年12月31日 23:59:59
+ * "近X天" → 从 X 天前 00:00:00 到今天 23:59:59
+ - 日期转时间戳:所有日期转换为 Unix 时间戳(秒)
+ - 时间范围格式:字段 >= 起始时间戳 && 字段 <= 结束时间戳
+ - 如果没有明确的时间需求,不要添加任何时间过滤条件
+
+ 6. 示例:
+ ✅ 正确输出:
+ - "客户名称中科精工" → sCustomerName == '中科精工'
+ - "中科精工的报价单明细" → sCustomerName == '中科精工'
+ - "产品以彩盒开头" → sProductStyle like '彩盒%'
+ - "无条件" → ""
+
+ ❌ 错误输出(禁止):
+ - "中科精工的报价单明细" → true
+ - "中科精工的报价单明细" → false
+ - "中科精工的报价单明细" → 1
+
+ 7. 输出格式:
+ - 仅返回纯过滤条件,无任何解释、换行、备注
+ - 单条件:sCustomerName == '中科精工'
+ - 多条件:(sCustomerName == '中科精工' && sProductStyle like '彩盒%')
+ - 无条件:直接返回空字符串 ""
+ """)
+ @UserMessage("""
【用户查询】
- {{userInput}}
+ 【当前时间】
+ - {{sDataNow}}
【可用字段】
- {{sMilvusFiled}}
【字段说明】
@@ -178,5 +202,7 @@ public interface ErpAiAgent {
String getMilvusFilter(@MemoryId String userId,
@V("userInput") String userInput,
@V("sMilvusFiled") String sMilvusFiled,
- @V("sMilvusFiledDescription") String sMilvusFiledDescription);
+ @V("sMilvusFiledDescription") String sMilvusFiledDescription,
+ @V("sDataNow") String sDataNow);
+
}
diff --git a/src/main/java/com/xly/entity/AiResponseDTO.java b/src/main/java/com/xly/entity/AiResponseDTO.java
index bc5fa66..72f84e7 100644
--- a/src/main/java/com/xly/entity/AiResponseDTO.java
+++ b/src/main/java/com/xly/entity/AiResponseDTO.java
@@ -139,6 +139,17 @@ public class AiResponseDTO implements Serializable {
*/
private String errorCode;
+ /**
+ * 数据库类型 X: 向量库 S:数据库
+ */
+ private String dbType;
+
+ /**
+ * 数据库类型 H: 缓存 D: 动态
+ */
+ private String dbCach;
+
+
// ============ 便捷方法 ============
/**
diff --git a/src/main/java/com/xly/entity/ToolMeta.java b/src/main/java/com/xly/entity/ToolMeta.java
index b2874c4..b2e4542 100644
--- a/src/main/java/com/xly/entity/ToolMeta.java
+++ b/src/main/java/com/xly/entity/ToolMeta.java
@@ -50,5 +50,6 @@ public class ToolMeta {
private String sVectorfiled;
private String sVectorjson;
private String sVectorfiledAll;
+ private String sVectorfiledShow;
}
diff --git a/src/main/java/com/xly/entity/UserSceneSession.java b/src/main/java/com/xly/entity/UserSceneSession.java
index 8de87f9..76bf994 100644
--- a/src/main/java/com/xly/entity/UserSceneSession.java
+++ b/src/main/java/com/xly/entity/UserSceneSession.java
@@ -67,6 +67,16 @@ public class UserSceneSession {
private Map args;
/**
+ * 数据库类型 X: 向量库 S:数据库
+ */
+ private String dbType;
+
+ /**
+ * 数据库类型 H: 缓存 D: 动态
+ */
+ private String dbCach;
+
+ /**
* 构建场景选择提示语:展示权限内场景,引导用户选择
* @return 自然语言提示语
*/
diff --git a/src/main/java/com/xly/milvus/service/AiGlobalAgentQuestionSqlEmitterService.java b/src/main/java/com/xly/milvus/service/AiGlobalAgentQuestionSqlEmitterService.java
index c98c0d7..c560544 100644
--- a/src/main/java/com/xly/milvus/service/AiGlobalAgentQuestionSqlEmitterService.java
+++ b/src/main/java/com/xly/milvus/service/AiGlobalAgentQuestionSqlEmitterService.java
@@ -12,7 +12,7 @@ public interface AiGlobalAgentQuestionSqlEmitterService {
* @return void
* @Description 插入向量库
**/
- void addAiGlobalAgentQuestionSqlEmitter(String sKey,Map data, String sQuestion, String sSqlContent, String collectionName);
+ void addAiGlobalAgentQuestionSqlEmitter(String sKey,Map data,String sQuestion,String sSqlContent,String cachType,String collectionName);
Map queryAiGlobalAgentQuestionSqlEmitter(String searchText, String collectionName);
diff --git a/src/main/java/com/xly/milvus/service/MilvusService.java b/src/main/java/com/xly/milvus/service/MilvusService.java
index 178052e..7960561 100644
--- a/src/main/java/com/xly/milvus/service/MilvusService.java
+++ b/src/main/java/com/xly/milvus/service/MilvusService.java
@@ -54,5 +54,7 @@ public interface MilvusService {
* @return java.util.Map
* @Description 获取配置
**/
- Map getMilvusFiled(String sVectorfiled,String sVectorfiledAll);
+ Map getMilvusFiled(String sVectorfiled,String sVectorfiledAll,String sVectorfiledShow);
+
+ boolean isValidMilvusFilter(String milvusFilter);
}
\ No newline at end of file
diff --git a/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java b/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java
index bacaa16..d178dcf 100644
--- a/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java
+++ b/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java
@@ -2,6 +2,7 @@ package com.xly.milvus.service.impl;
import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.xly.milvus.service.AiGlobalAgentQuestionSqlEmitterService;
@@ -52,16 +53,19 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
* @Description 插入数据
**/
@Override
- public void addAiGlobalAgentQuestionSqlEmitter(String sKey,Map data,String sQuestion,String sSqlContent,String collectionName) {
+ public void addAiGlobalAgentQuestionSqlEmitter(String sKey,Map data,String sQuestion,String sSqlContent,String cachType,String collectionName) {
// 向量化
List vector = vectorizationService.textToVector(sKey);
if (vector == null || vector.isEmpty()) {
throw new RuntimeException("向量化失败");
}
+ if(ObjectUtil.isEmpty(sSqlContent)){
+ sSqlContent = StrUtil.EMPTY;
+ }
// 2. 转换为Milvus格式
- JsonObject row = convertToMilvusRow(data, vector,sQuestion,sSqlContent,sKey);
+ JsonObject row = convertToMilvusRow(data, vector,sQuestion,sSqlContent,cachType,sKey);
//创建集合
// createCollection(collectionName);
@@ -86,7 +90,7 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
Map searchParams = new HashMap<>();
searchParams.put("nprobe", 10);
// 对于 IP 度量,相似度范围在 [minScore, maxScore]
- searchParams.put("radius", 0.9); // 最小相似度
+ searchParams.put("radius", 0.98); // 最小相似度
searchParams.put("range_filter", 1); // 最大相似度
// 1. 确保集合已加载
ensureCollectionLoaded(collectionName);
@@ -108,7 +112,6 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
// .limit(100)
// .build();
// QueryResp queryResp = milvusClient.query(queryReq);
-
// 3. 创建 Milvus FloatVec 对象
FloatVec floatVec = new FloatVec(floatArray);
// 4. 构建搜索请求
@@ -118,7 +121,7 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
.annsField("vector") // 向量字段名
.topK(10) // 返回最相似的10条
.metricType(IndexParam.MetricType.IP) // 内积相似度
- .outputFields(Arrays.asList("sQuestion", "sSqlContent", "data_id", "create_time","metadata"))
+ .outputFields(Arrays.asList("sQuestion", "sSqlContent", "data_id","db_name", "create_time","metadata"))
.searchParams(searchParams)
.build();
// 5. 执行搜索
@@ -230,7 +233,7 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
/**
* 从实体对象构建Milvus插入数据
*/
- public JsonObject convertToMilvusRow(Map data, List vector,String sQuestion,String sSqlContent,String sKey) {
+ public JsonObject convertToMilvusRow(Map data, List vector,String sQuestion,String sSqlContent,String cachType,String sKey) {
JsonObject row = new JsonObject();
// 添加向量
@@ -242,6 +245,7 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
row.addProperty("data_id", data.get("sId").toString());
row.addProperty("sQuestion", sQuestion);
row.addProperty("sSqlContent", sSqlContent);
+ row.addProperty("cachType", cachType);
// 创建时间字段 - 必须提供!
row.addProperty("create_time", System.currentTimeMillis());
// 创建时间字段 - 必须提供!
@@ -305,23 +309,33 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
CreateCollectionReq.FieldSchema.builder()
.name("sQuestion")
.dataType(DataType.VarChar)
- .maxLength(1000)
+ .maxLength(5000)
.description("用户问题")
.build(),
- // 4. SQL内容字段
+ // 4. SQL内容字段 - 设置为可空
CreateCollectionReq.FieldSchema.builder()
.name("sSqlContent")
.dataType(DataType.VarChar)
- .maxLength(5000) // SQL可能较长
+ .maxLength(50000) // SQL可能较长
+ .isPrimaryKey(false)
+ .isNullable(true) // 设置为 true,允许为空
.description("SQL语句")
.build(),
+ // 4. 缓存类型
+ CreateCollectionReq.FieldSchema.builder()
+ .name("cachType")
+ .dataType(DataType.VarChar)
+ .maxLength(100) // 缓存类型
+ .description("缓存类型")
+ .build(),
+
// 5. 数据ID字段
CreateCollectionReq.FieldSchema.builder()
.name("data_id")
.dataType(DataType.VarChar)
- .maxLength(100)
+ .maxLength(500) // 增加最大长度
.description("原始数据ID")
.build(),
@@ -341,7 +355,7 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
CreateCollectionReq.FieldSchema.builder()
.name("sKey")
.dataType(DataType.VarChar)
- .maxLength(100)
+ .maxLength(1000) // 增加最大长度
.description("存入的vector转换前数据")
.build()
);
@@ -667,7 +681,7 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
IndexParam questionIndex = IndexParam.builder()
.fieldName("sQuestion")
.indexName("idx_question")
- .indexType(IndexParam.IndexType.INVERTED) // 倒排索引
+ .indexType(IndexParam.IndexType.TRIE) // 倒排索引
.build();
allIndexParams.add(questionIndex);
@@ -675,14 +689,21 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent
IndexParam idIndex = IndexParam.builder()
.fieldName("data_id")
.indexName("idx_data_id")
- .indexType(IndexParam.IndexType.INVERTED)
+ .indexType(IndexParam.IndexType.TRIE)
.build();
allIndexParams.add(idIndex);
+ IndexParam idx_cach_type = IndexParam.builder()
+ .fieldName("cachType")
+ .indexName("idx_cach_type")
+ .indexType(IndexParam.IndexType.TRIE)
+ .build();
+ allIndexParams.add(idx_cach_type);
+
IndexParam sKey = IndexParam.builder()
.fieldName("sKey")
.indexName("s_key")
- .indexType(IndexParam.IndexType.INVERTED)
+ .indexType(IndexParam.IndexType.TRIE)
.build();
allIndexParams.add(sKey);
diff --git a/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java b/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java
index e09b5b3..8c4ebcb 100644
--- a/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java
+++ b/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java
@@ -264,24 +264,29 @@ public class MilvusServiceImpl implements MilvusService {
* @Description 返回组装动态内容
**/
@Override
- public Map getMilvusFiled(String sVectorfiled,String sVectorfiledAll){
+ public Map getMilvusFiled(String sVectorfiled,String sVectorfiledAll,String sVectorfiledShow){
List sFileds = new ArrayList<>();
+ List filedsShow = new ArrayList<>();
List sFiledDescriptions = new ArrayList<>();
List sFiledDescriptionsAll = new ArrayList<>();
List