news 2026/6/14 5:34:06

开源大模型Query Planning实战:Mistral+Qwen分层架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源大模型Query Planning实战:Mistral+Qwen分层架构

1. 项目概述:当开源大模型开始“自己画路线图”

去年我花大量时间在真实业务场景里跑通各种LLM应用,从客服工单自动归类、销售话术实时生成,到内部知识库的语义检索增强——不是调API写个demo,而是把模型嵌进生产系统里,扛住每天上万次请求、处理带格式的Excel附件、对接老掉牙的Oracle数据库。过程中最常被问到的问题是:“不用GPT-4,纯开源模型能不能做Query Planning?”——注意,这里说的不是简单地让模型回答问题,而是让它像一个资深DBA那样,面对一句“查上个月华东区销售额超50万的客户名单”,先拆解意图、识别实体、判断数据源、规划SQL执行顺序、预估字段依赖关系,最后输出可执行的结构化计划。这背后需要模型同时具备强推理能力、精准的函数识别、稳定的JSON生成,以及对多步骤逻辑链的保持能力。

很多人一听到“开源LLM做Query Planning”就下意识摇头,觉得这是GPT-4专属能力。但实际踩过坑后我发现,问题不在于开源模型“不能做”,而在于我们过去用错了方法:总想让一个7B参数的模型直接输出200行嵌套JSON,还要求它一次命中所有字段名和表关联逻辑。这就像让一个刚考完驾照的新手直接开重卡跑青藏线——方向是对的,但没配好“驾驶舱”。真正可行的路径,是把Query Planning拆成可验证、可调试、可降级的原子环节:意图识别 → 实体抽取 → 数据源路由 → SQL骨架生成 → 安全校验 → 执行计划组装。每个环节用最适合的工具链承接,模型只负责它最擅长的部分。比如Mistral-7B-Instruct在“意图-函数映射”上表现惊人,但它生成完整SQL时容易漏掉JOIN条件;而Qwen-14B在字段补全上更稳,但推理速度慢一倍。把它们像乐高一样拼起来,反而比硬塞给一个大模型更可靠。这篇文章就是我把过去半年在三个不同行业客户现场(金融风控、电商BI、医疗科研平台)落地的Query Planning方案,全部掏出来拆解清楚——不讲虚的架构图,只说哪一步该用什么模型、为什么这么选、参数怎么调、出错了看哪几行日志。

2. 核心思路拆解:为什么放弃“单一大模型包打天下”的幻想

2.1 Query Planning的本质不是“生成SQL”,而是“构建执行契约”

很多人把Query Planning理解成“让模型写SQL”,这是根本性偏差。真正的Query Planning要解决的是执行前的确定性问题:当用户输入“对比Q3和Q4的复购率变化”,系统必须在执行任何SQL前明确回答五个问题:

  1. 数据源在哪?是MySQL订单库、ClickHouse用户行为表,还是离线Hive分区?
  2. 关键实体是什么?“Q3”指2023-07-01至2023-09-30,“复购率”需定义为“二次购买用户数/首次购买用户数”;
  3. 字段依赖链有多深?计算复购率需要先关联订单表和用户表,再聚合时间窗口;
  4. 权限是否允许?用户角色能否访问原始订单明细,还是只能查预聚合视图?
  5. 失败降级路径是什么?如果实时库超时,是否切到T+1离线快照?

这些问题的答案,必须以机器可解析、人可审计的结构化格式固化下来,形成一份“执行契约”。而GPT-4的Function Calling之所以好用,不是因为它生成JSON能力强,而是OpenAI把这五类问题抽象成了标准函数签名(如get_data_source(schema: str, table_hint: str)resolve_time_range(period: str)),模型只需做精准匹配。开源模型缺的从来不是能力,而是这种工业级的接口契约设计

2.2 Mistral-7B-Instruct的突破点:轻量模型的“函数直觉”

2023年底Mistral-7B-Instruct发布时,我第一时间用它的Instruct版本跑了200个Query Planning测试用例。结果发现一个反直觉现象:在“函数分类准确率”上,它比13B的Llama-2-Chat高出12%,尤其在区分get_customer_segment()get_customer_churn_rate()这类语义相近函数时错误率更低。深入分析日志后找到原因——Mistral的训练数据中大量包含Alpaca-style指令微调样本,其损失函数强制模型学习“指令-动作”的强绑定关系。比如当提示词含“请严格按以下JSON Schema输出”,模型会抑制自由生成倾向,转而聚焦于Schema字段的语义对齐。这恰好契合Query Planning中“函数调用”的核心诉求:不是让模型创造新函数,而是让它从预设的37个业务函数中精准选出最匹配的一个。

提示:Mistral-7B-Instruct在函数调用场景下的最佳实践是禁用temperature=0.8以上。实测发现,当temperature设为0.3时,函数名识别准确率稳定在92.4%;一旦升到0.7,模型开始“创造性发挥”,把get_sales_summary()错标为get_revenue_breakdown(),因为两者都含“summary”和“breakdown”词根。这不是模型能力问题,而是温度参数放大了语义漂移。

2.3 开源方案的三重防线设计

基于上述认知,我放弃了单模型端到端方案,转而构建三层防御体系:

  • 第一层:意图锚定层(Intent Anchoring Layer)
    用Mistral-7B-Instruct专攻“用户输入→函数ID映射”,输出固定格式的JSON:{"function_id": "fn_203", "confidence": 0.96, "reasoning": "用户提到'华东区'和'销售额',匹配区域销售汇总函数"}。此层不生成任何SQL,只做决策,响应时间压到300ms内。

  • 第二层:参数精炼层(Parameter Refinement Layer)
    将第一层输出的function_id作为上下文,喂给Qwen-14B(经SQL微调)。它负责填充具体参数,如{"region": "east_china", "time_range": {"start": "2023-10-01", "end": "2023-10-31"}, "threshold": 500000}。这里利用Qwen对中文时间表达式(“上个月”、“近30天”)的强理解力,避免Mistral因token限制导致的时间范围截断。

  • 第三层:契约校验层(Contract Validation Layer)
    用轻量Python规则引擎(非LLM)做最终校验:检查region值是否在白名单内、time_range跨度是否超7天、threshold是否为正整数。任何校验失败立即触发降级,返回预设的兜底SQL或人工审核队列。

这套设计让整体成功率从单模型的68%提升到93.7%,且每个环节可独立监控——当某天成功率跌到89%,运维人员能立刻定位是第二层参数精炼出问题,而非笼统地说“模型不准”。

3. 实操细节与关键配置:从零搭建可落地的Query Planning流水线

3.1 环境准备与模型选型实测对比

部署环境采用NVIDIA A10G(24GB显存)服务器,操作系统Ubuntu 22.04。所有模型均通过vLLM 0.3.2部署,启用PagedAttention内存管理。以下是三款主力模型在Query Planning任务上的实测数据(测试集:500条真实业务查询,覆盖电商、金融、SaaS场景):

模型显存占用平均延迟(ms)函数ID准确率参数填充完整率JSON格式合规率
Mistral-7B-Instruct12.4GB28792.4%76.1%98.2%
Qwen-14B-Chat18.6GB64285.3%94.7%91.5%
Llama-2-13B-Chat16.8GB51379.8%82.3%87.6%

注意:Qwen-14B的“参数填充完整率”虽高,但其JSON合规率仅91.5%,主要因生成"time_range": {"start": "2023-10-01", "end": "2023-10-31"}时,有8.5%概率漏掉逗号导致JSON解析失败。解决方案是在vLLM输出后增加一行Python校验:json.loads(output.replace(" ", "").replace("\n", "")),强制抹平格式干扰。

模型加载代码示例(vLLM):

from vllm import LLM, SamplingParams # Mistral-7B-Instruct用于意图锚定 mistral_llm = LLM( model="/models/mistral-7b-instruct-v0.2", tensor_parallel_size=1, gpu_memory_utilization=0.85, max_model_len=4096 ) # Qwen-14B用于参数精炼(需额外加载tokenizer) qwen_llm = LLM( model="/models/Qwen-14B-Chat", tokenizer="/models/Qwen-14B-Chat", tensor_parallel_size=1, gpu_memory_utilization=0.92, max_model_len=8192 )

3.2 意图锚定层的Prompt工程:让Mistral学会“看题干选答案”

Mistral-7B-Instruct对Prompt结构极其敏感。经过37轮AB测试,最终确定的Prompt模板如下(已脱敏处理):

<|system|> 你是一个专业的Query Planning引擎,负责将用户自然语言查询映射到预定义的函数ID。请严格按以下JSON Schema输出,不要添加任何额外字段或解释: { "function_id": "字符串,必须是下列ID之一", "confidence": "0到1之间的浮点数,表示匹配置信度", "reasoning": "20字内简述匹配依据" } 可用函数ID列表: fn_101: get_customer_list - 查询客户列表,支持region/time_range过滤 fn_102: get_sales_summary - 区域销售汇总,需指定region和time_range fn_103: get_product_trend - 商品趋势分析,需指定product_category和time_range ... <|user|> {user_query} <|assistant|>

关键设计点解析:

  • 系统指令前置:Mistral对<|system|>标签的权重极高,放在开头能有效压制模型的“自由发挥欲”。
  • JSON Schema强制约束:明确写出"function_id": "字符串"而非"function_id": "str",因为Mistral在训练时见过大量Python类型注释,会误判为代码生成任务。
  • 函数ID列表去描述化:不写“获取客户列表”,而写get_customer_list - 查询客户列表...,用短横线分隔ID与描述,实测使ID识别准确率提升6.3%。原因是Mistral更习惯处理“标识符-说明”的键值对模式。

实测案例:
用户输入:“查一下北京和上海的客户数量,时间是今年前三个月”
Mistral输出:

{"function_id": "fn_101", "confidence": 0.94, "reasoning": "含'客户'和'北京上海'"}

注意:它没有选择fn_102(销售汇总),因为用户未提“销售额”“订单”等关键词——这正是意图锚定的价值:用最小代价排除错误路径。

3.3 参数精炼层的上下文注入技巧

当Qwen-14B接收参数填充任务时,不能直接喂{"function_id": "fn_101", "user_query": "北京和上海的客户数量..."},这样会导致它重复生成函数ID。正确做法是构造“指令-上下文-约束”三段式Prompt:

<|im_start|>system 你是一个SQL参数专家,根据用户查询和函数定义,填充JSON参数。必须严格遵循以下规则: 1. 只输出JSON,不加任何解释 2. 时间范围必须转换为ISO格式,如"2023-01-01" 3. 地区名称必须用英文下划线格式,如"beijing_shanghai" <|im_start|>user 函数定义:get_customer_list(region: str, time_range: {start: str, end: str}) 用户查询:查一下北京和上海的客户数量,时间是今年前三个月 <|im_start|>assistant {"region": "beijing_shanghai", "time_range": {"start": "2023-01-01", "end": "2023-03-31"}}

这里的关键是把函数定义作为独立段落,而非嵌入用户查询。Qwen在训练时接触过大量API文档,对“函数定义→参数填充”的模式识别准确率远高于“自然语言→参数”的端到端生成。我们曾对比过两种方式:当函数定义单独成段时,时间范围解析准确率达98.2%;若混在用户查询中(如“函数get_customer_list需要region和time_range,请填参数:...”),准确率骤降至73.5%。

3.4 契约校验层的Python规则引擎实现

校验层代码需满足三个原则:零依赖、毫秒级、可热更新。因此不使用Django ORM或SQLAlchemy,而是纯Python字典操作:

def validate_contract(contract: dict) -> tuple[bool, str]: """校验Query Planning契约,返回(是否通过, 错误信息)""" # 检查必填字段 required_keys = ["function_id", "region", "time_range"] for key in required_keys: if key not in contract: return False, f"缺失必填字段: {key}" # 地区白名单校验 valid_regions = {"beijing_shanghai", "east_china", "south_china"} if contract["region"] not in valid_regions: return False, f"地区'{contract['region']}'不在白名单中" # 时间范围校验 try: start = datetime.fromisoformat(contract["time_range"]["start"]) end = datetime.fromisoformat(contract["time_range"]["end"]) if (end - start).days > 90: return False, "时间跨度不能超过90天" except (ValueError, KeyError): return False, "时间格式错误,需为ISO格式如'2023-01-01'" return True, "" # 使用示例 contract = {"function_id": "fn_101", "region": "beijing_shanghai", "time_range": {"start": "2023-01-01", "end": "2023-03-31"}} is_valid, msg = validate_contract(contract)

实操心得:校验规则必须和业务方共同制定,而非技术团队闭门造车。我们在某电商客户现场曾因“时间跨度限制”产生分歧——技术认为90天足够,但业务方坚持“促销活动分析需支持全年数据”。最终妥协方案是:校验层增加allow_full_year: bool字段,由权限系统控制,高权限用户可绕过时间限制。这印证了一个真理:Query Planning的边界,永远由业务规则而非技术能力定义。

4. 完整实操流程:从用户提问到生成可执行SQL

4.1 端到端流程图解(文字版)

整个Query Planning流水线共7个原子步骤,耗时控制在1.2秒内(P95延迟):

  1. 用户输入接收:前端提交{"query": "查华东区上月销售额超50万的客户"}
  2. 意图锚定:Mistral-7B-Instruct输出{"function_id": "fn_102", "confidence": 0.96, "reasoning": "含'华东区'和'销售额'"}
  3. 函数路由:根据fn_102查路由表,确认由Qwen-14B处理,且需注入get_sales_summary函数定义
  4. 参数精炼:Qwen-14B输出{"region": "east_china", "time_range": {"start": "2023-09-01", "end": "2023-09-30"}, "threshold": 500000}
  5. 契约校验:Python引擎验证region在白名单、时间跨度30天合规、threshold为正整数 → 通过
  6. SQL骨架生成:调用预编译的Jinja2模板,将参数注入SQL:
    SELECT customer_id, SUM(amount) as total_sales FROM sales_orders WHERE region = '{{ region }}' AND order_date BETWEEN '{{ time_range.start }}' AND '{{ time_range.end }}' GROUP BY customer_id HAVING SUM(amount) > {{ threshold }}
  7. 执行计划组装:附加元数据{"data_source": "mysql://prod-sales", "timeout_ms": 5000, "cache_ttl": 300},返回给执行引擎

4.2 关键参数的动态计算逻辑

Query Planning中最具挑战的是时间范围的动态解析。用户说“上月”,但系统需知道当前是2023年10月,才能算出2023-09-012023-09-30。我们不依赖模型生成时间字符串,而是用Pythondateutil库做确定性计算:

from dateutil.relativedelta import relativedelta from datetime import datetime, date def parse_relative_time(time_phrase: str) -> dict: """将相对时间表达式转为绝对时间范围""" now = datetime.now() if time_phrase == "上月": first_day = (now - relativedelta(months=1)).replace(day=1) last_day = now - relativedelta(days=now.day) return {"start": first_day.strftime("%Y-%m-%d"), "end": last_day.strftime("%Y-%m-%d")} elif time_phrase == "近30天": start = now - relativedelta(days=29) # 含今天共30天 return {"start": start.strftime("%Y-%m-%d"), "end": now.strftime("%Y-%m-%d")} # 其他规则... raise ValueError(f"不支持的时间表达式: {time_phrase}") # 在参数精炼层,Qwen只输出"time_phrase": "上月" # 校验层调用parse_relative_time()生成精确日期

这种设计彻底规避了模型在时间计算上的幻觉风险。实测显示,当Qwen输出"time_phrase": "上月"时,解析准确率100%;若让它直接输出"2023-09-01",错误率高达18.7%(常把9月错写成8月)。

4.3 错误注入与降级机制实战

任何Query Planning系统都必须面对“不可解查询”。我们的降级策略分三级:

  • 一级降级(自动):当契约校验失败(如地区不在白名单),返回预设的兜底SQL:
    SELECT 'N/A' as result, '地区不支持' as reason FROM dual

  • 二级降级(半自动):当Mistral置信度<0.85且Qwen参数填充完整率<80%,触发人工审核队列,向BI工程师推送企业微信消息:
    “待审Query:‘查华北区上季度流失客户’,疑似需新增region=‘north_china’,请2小时内确认”

  • 三级降级(手动):当连续3次同类型错误(如fn_102函数反复失败),自动冻结该函数ID,启动A/B测试:用Llama-2-13B重跑100条历史查询,若准确率提升超5%,则切换主模型。

这套机制让我们在某金融客户上线首月,将人工干预率从预期的12%压到2.3%,且所有降级操作均有完整审计日志,满足金融行业合规要求。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 问题速查表:高频故障与根因定位

现象可能根因快速验证方法解决方案
Mistral输出JSON含中文引号“”导致解析失败模型tokenizer未对齐,生成了全角符号print(repr(output))查看ASCII码在vLLM输出后增加output.encode('utf-8').decode('unicode_escape')
Qwen生成"time_range": {"start": "2023-01-01"}但漏掉"end"字段Prompt中未强调“必须包含所有字段”,模型默认省略可选字段检查Prompt末尾是否有"注意:所有字段必须存在,不可省略"在校验层强制补全:if "end" not in time_range: time_range["end"] = time_range["start"]
多次查询同一语句,Mistral返回不同function_idtemperature未锁死,或vLLM缓存未关闭设置temperature=0--disable-log-stats重启服务生产环境必须设temperature=0,开发环境才用0.3调试
契约校验通过,但SQL执行报“Unknown column ‘region’”模型生成的region字段名与数据库实际列名不一致(如DB用area_code对比contract["region"]SHOW COLUMNS FROM sales_orders在路由表中增加字段映射:{"region": "area_code", "threshold": "min_amount"}

5.2 那些只有踩过才懂的经验

经验一:永远用“最小可行Prompt”启动
别一上来就堆砌200字Prompt。我的标准流程是:先用{"function_id": "fn_101"}这种极简输出测试Mistral,确认它能稳定返回JSON;再加confidence字段;最后加reasoning。每加一个字段,都跑50条测试用例看准确率变化。曾有个客户坚持要在Prompt里写“你是一个顶尖的AI专家”,结果函数ID准确率从92%暴跌到76%——模型被“专家”人设带偏,开始过度思考。

经验二:JSON Schema的字段顺序就是执行优先级
Mistral对JSON字段顺序敏感。当把{"confidence": 0.96, "function_id": "fn_101"}改为{"function_id": "fn_101", "confidence": 0.96}后,准确率提升2.1%。原因是模型在训练时见过大量{"id": "...", "name": ...}格式,已形成“标识符优先”的认知惯性。所以Schema设计时,把最关键的function_id永远放在第一位。

经验三:校验层的日志必须带原始输入
某次线上故障,校验层报“时间跨度超90天”,但运维查日志只看到{"start": "2023-01-01", "end": "2023-04-30"}。后来发现是前端传参错误,把“2023-04-30”错传为“2023-04-300”。若校验日志不记录原始user_query,根本无法定位。现在每条校验日志都强制包含:

{ "original_query": "查2023年Q1销售额", "parsed_params": {"start": "2023-01-01", "end": "2023-04-300"}, "error": "time format invalid" }

经验四:别迷信“越大越好”,7B模型在特定场景碾压13B
在某次压力测试中,Llama-2-13B在1000QPS下平均延迟达1.8秒,而Mistral-7B-Instruct仅0.32秒。当用户等待超800ms时,放弃率飙升至43%。我们最终采用“混合部署”:Mistral处理95%的常规查询,Llama-2-13B只处理需深度推理的5%复杂查询(如跨5张表的关联分析)。这比全量上13B节省47%的GPU成本。

6. 进阶优化方向:让Query Planning从“能用”走向“好用”

6.1 引入RAG增强意图锚定层

当前Mistral-7B-Instruct的函数ID列表是静态的37个。但业务在变——上周新增了fn_204: get_supply_chain_delay(),下周可能要下线fn_103。硬编码维护既易出错又难审计。解决方案是用RAG动态注入函数文档:

  • 构建函数知识库:每条记录含function_iddescriptionsample_queries(如["查供应商交货延迟天数", "看物流超时情况"]
  • 用户查询到达时,先用Sentence-BERT向量化,检索Top3相似函数
  • 将检索结果拼接到Prompt中:可用函数(按相关性排序):1. fn_204: get_supply_chain_delay... 2. fn_102: get_sales_summary...

实测显示,RAG加持后,新函数上线首周的识别准确率从58%提升到89%,且无需重新微调模型。

6.2 用LoRA微调替代全量微调

有客户要求模型理解其私有术语,如把“GMV”固定映射到get_gross_merchandise_value()。全量微调7B模型需32GB显存和24小时,而LoRA微调仅需12GB显存和2小时。我们用QLoRA在Mistral-7B-Instruct上微调,专注优化<|user|>function_id的映射层:

from peft import LoraConfig, get_peft_model config = LoraConfig( r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"], # 只微调注意力层 lora_dropout=0.1, bias="none" ) lora_model = get_peft_model(mistral_llm, config)

微调后,在客户私有测试集上,GMV相关查询的函数ID准确率从71%提升到96.3%,且模型体积仅增加12MB(原模型3.7GB)。

6.3 构建Query Planning的可观测性看板

最后分享一个被低估的关键点:Query Planning必须有完整的可观测性。我们在Grafana中搭建了四维看板:

  • 成功率热力图:按小时统计各function_id的成功率,红色区块自动告警
  • 延迟分布图:P50/P95/P99延迟曲线,定位慢查询瓶颈环节
  • 降级路径追踪:统计一级/二级/三级降级占比,判断系统健康度
  • 意图漂移检测:用余弦相似度计算每日用户查询向量均值,突变超15%即触发人工审查

这个看板上线后,我们首次发现一个隐藏问题:每周五下午3点,fn_102成功率会规律性下跌12%。追查发现是财务部同事习惯此时提交“月度销售快报”查询,而他们的表述(“截止今天的数据”)与常规“上月”存在语义冲突。最终在Prompt中增加了周五特供规则:“若查询含‘截止今天’,优先匹配fn_102并自动设end为today”。

我在实际使用中发现,Query Planning最难的不是技术实现,而是让业务方接受“机器需要确定性输入”。当他们说“大概查下最近的销售情况”,我们必须追问:“最近是7天、30天,还是滚动30天?”——这看似增加了沟通成本,实则把模糊需求转化为可审计、可追溯、可优化的数字契约。这套方法论已在三个客户现场稳定运行超180天,最高日处理Query 23,741次,平均错误率1.2%。如果你也在尝试开源LLM的Query Planning,不妨从Mistral-7B-Instruct的意图锚定层开始,用最轻的模型解决最确定的问题,再逐步叠加能力。记住,好的工程不是堆参数,而是让每个组件都在它最舒服的区间工作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 5:27:57

Macro vs Weighted F1:你的多分类模型报告到底该用哪个?一次讲清楚

Macro vs Weighted F1&#xff1a;多分类模型评估指标深度解析当你面对一个新闻文本分类任务——需要将文章分为体育、科技、娱乐等类别&#xff0c;而各类别样本量差异巨大时&#xff0c;模型评估指标的选择会直接影响你对模型性能的判断。本文将带你深入理解宏观F1&#xff0…

作者头像 李华
网站建设 2026/6/14 5:27:55

AI发布工作流配置指南_用CSDN_AI数字营销把分发自动化

AI发布工作流配置指南&#xff1a;用CSDN AI数字营销把分发自动化 前阵子跟一个写技术博客的朋友吃饭&#xff0c;聊到各自的日常。他说的一句话我记到现在——“写文章两个小时&#xff0c;发文章花掉的时间能再写两篇。”我深有同感。 更让我不舒服的是&#xff0c;我发现自己…

作者头像 李华
网站建设 2026/6/14 5:24:15

ATGM332D-5N vs U-blox NEO:多模GPS模块怎么选?实测对比告诉你

ATGM332D-5N与U-blox NEO多模GPS模块实战评测&#xff1a;工程师选型指南在物联网和智能硬件快速发展的今天&#xff0c;精准定位技术已成为车载导航、物流追踪、可穿戴设备等领域的核心需求。面对市场上琳琅满目的GPS模块&#xff0c;硬件工程师常常陷入选择困境&#xff1a;是…

作者头像 李华
网站建设 2026/6/14 5:21:03

TokenTrace:生成式AI多概念溯源水印技术解析

1. TokenTrace框架概述TokenTrace是一种创新的主动式数字水印框架&#xff0c;专门针对生成式AI时代的多概念溯源挑战而设计。与传统的像素级水印技术不同&#xff0c;TokenTrace通过在文本语义和潜在域两个维度嵌入水印信息&#xff0c;实现了对图像中多个组成概念的独立识别和…

作者头像 李华