OpenGL渲染与几何内核那点事-项目实践理论补充(二-1-(5):最原始的“命令行”——从 printf 到实时控制台)

@[TOC](OpenGL渲染与几何内核那点事-项目实践理论补充(二-1-(5):最原始的"命令行"------从 printf 到实时控制台))


代码仓库入口:


系列文章规划:

巨人的肩膀:

  • deepseek
  • gemini

OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(5):给 CAD 加上"控制台"------让用户能实时"调参数、看性能")

    • [续接上文:你的 CAD 终于像一个真正的 CAD 了](#续接上文:你的 CAD 终于像一个真正的 CAD 了)
    • [阶段一:最原始的"命令行"------从 printf 到实时控制台](#阶段一:最原始的“命令行”——从 printf 到实时控制台)
      • 你最开始是怎么干的
      • [ImGui 来了:把控制台"贴"到 3D 视口上](#ImGui 来了:把控制台“贴”到 3D 视口上)
      • [深度解析:ImGui 的控制台之道](#深度解析:ImGui 的控制台之道)
    • 阶段二:让用户"说出来"------从按钮点击到自然语言指令
    • [阶段三:从"命令解析器"到"几何专家"------连接 UI 与算法](#阶段三:从“命令解析器”到“几何专家”——连接 UI 与算法)
      • [命令分发到 GeometryExpert](#命令分发到 GeometryExpert)
      • [结果反馈到 UI 界面](#结果反馈到 UI 界面)
    • [故事还未结束:你的 CAD 已经为 AI 时代准备好了](#故事还未结束:你的 CAD 已经为 AI 时代准备好了)
      • [深度扩展:从规则引擎到 AI Agent 的完整技术栈](#深度扩展:从规则引擎到 AI Agent 的完整技术栈)

代码仓库入口:


系列文章规划:

巨人的肩膀:

  • deepseek
  • gemini

续接上文:你的 CAD 终于像一个真正的 CAD 了

上回书说到,你绞尽脑汁搞定了层、块、UCS、布局视口这些底层数据结构,又攻克了 B-Rep 曲面、几何内核、多文档并发这些工业化难题。你的 CAD 终于不再是一个"玩具渲染器",而是一个能画出标准零件、处理复杂装配体的正经软件了。

但现在,你坐在电脑前,看着自己的代码,总觉得少了点什么。

画面是这样的:

你打开自己开发的 CAD,导入一个 10 万个零件的汽车发动机模型。你的 BVH 空间索引确实很快,渲染也流畅,但你心里没底------到底是因为你的 BVH 写得真的好,还是单纯因为显卡够强?如果是 BVH 的功劳,构建这棵树花了多长时间?它剔除掉了多少实体?

你又点了一下选中功能,光标指到发动机上的一个螺栓。没错,确实是瞬间高亮显示。但你还是心里犯嘀咕------射线求交到底算了多少次?有没有遍历了不需要的节点?如果用户投诉"选中速度慢",你连一个反驳的数据都拿不出来。

更让你烦躁的是,老板走过来问:"小C,听说深度学习现在很火,咱能不能用大模型控制 CAD?能不能让用户直接说'帮我把所有红色的螺栓改成蓝色',然后程序自动完成?"

你尴尬地笑了笑,心想:"我连自己代码里发生了什么都不知道,还谈什么让 AI 来控制?"

你终于明白,你的 CAD 缺少一个"控制台"------一个能让开发者(以及未来可能的 AI)随时窥探程序内部状态、实时下达指令的交互中心。

于是你决定,给你的 CAD 加一个"ImGui 控制台"------既能显示性能数据,又能让用户输入自然语言指令。这就是你故事的新起点。


阶段一:最原始的"命令行"------从 printf 到实时控制台

你最开始是怎么干的

在没有 ImGui 之前,你调试 CAD 的方式极其原始:

cpp 复制代码
// 在 render_manager.cpp 的渲染循环里
void RenderManager::Render() {
    auto start = std::chrono::high_resolution_clock::now();
    
    // ... 一大堆渲染代码 ...
    
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
    
    // 最原始的调试方式:打印到控制台
    std::cout << "Frame time: " << duration.count() << " ms" << std::endl;
    std::cout << "Visible entities: " << visible_count << std::endl;
    std::cout << "BVH nodes visited: " << bvh_visited << std::endl;
}

程序一跑起来,黑色控制台窗口疯狂刷屏,你根本看不清数字,更别说实时观察趋势了。更糟的是,你想改一个参数------比如把 BVH 的遍历深度阈值从 10 改成 20------必须停掉程序、改代码、重新编译、重新跑。这个过程在 C++ 大项目里动辄几分钟,调试效率低到令人发指。

这就是最原始的"命令行调试时代" ------一切靠 printf,一切靠重启。

ImGui 来了:把控制台"贴"到 3D 视口上

你想起游戏开发中常用的 Dear ImGui------一个轻量级的"即时模式" GUI 库。它的哲学很简单:每一帧你都重新描述整个 UI,ImGui 只负责把控件画出来,不保存任何 UI 状态。这跟你渲染 3D 物体的思路一模一样------每帧根据当前数据重新绘制。

你花了半小时,在 render_manager.cpp 的渲染循环里嵌入了 ImGui:

cpp 复制代码
// 每帧开始
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();

// 创建你的控制台窗口
ImGui::Begin("CAD 控制台");
ImGui::Text("帧时间: %.3f ms", frame_time);
ImGui::Text("可见实体: %d", visible_count);
ImGui::Text("BVH 遍历节点: %d", bvh_visited);

// 还可以加一个滑块,实时调节参数!
static float bvh_threshold = 10.0f;
ImGui::SliderFloat("BVH 深度阈值", &bvh_threshold, 1.0f, 50.0f);
ImGui::End();

// 渲染 3D 场景
RenderScene();

// 最后把 ImGui 画到屏幕上
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

你重新编译,跑起来,瞬间眼前一亮:3D 视口右上角悬浮着一个半透明的黑色面板,里面实时跳动着帧率、可见实体数、BVH 节点数。你拖动那个"BVH 深度阈值"滑块,画面里的剔除效果立刻发生变化------不再需要重启程序!

这就是你的第一个"实时控制台"。

它让你从"盲人摸象"变成了"心明眼亮"。你终于能回答老板的问题了:"帧率下降,是因为 BVH 遍历了太多节点,不是显卡不行。"

深度解析:ImGui 的控制台之道

1. ImGui 的设计哲学:Immediate Mode GUI

Dear ImGui(Immediate Mode Graphical User Interface)与传统的"保留模式" GUI(如 Qt、MFC)完全不同:

  • 保留模式:你创建一个按钮对象,它一直存在于内存中,你通过事件回调来响应点击。这适合复杂的、有大量状态的应用程序(如 Word、Photoshop)。
  • 即时模式 :每帧你都写 if (ImGui::Button("点击我")) { ... },ImGui 不保存按钮的状态,只负责在当前帧画出它并告诉你是否被点击。这极其适合 实时渲染应用(游戏引擎、3D 编辑器、CAD),因为它天然与渲染循环同步,没有复杂的状态管理,代码极其直观。

2. 核心 API:构建控制台的基石

  • ImGui::Begin() / ImGui::End():创建一个可拖拽、可折叠的窗口。所有控件都放在这对调用之间。
  • ImGui::Text() :显示静态文本,支持格式化字符串(类似 printf)。
  • ImGui::SliderFloat() / ImGui::SliderInt():创建一个滑块,绑定到你的 C++ 变量上。用户拖动滑块,变量值实时改变。
  • ImGui::InputText():创建一个文本输入框,支持单行和多行。这是自然语言交互的入口。
  • ImGui::PlotLines() / ImGui::PlotHistogram():绘制折线图或直方图,用于可视化帧率、内存使用等随时间变化的指标。

3. 在你的项目中的应用

src/render/render_manager.cpp 中,你已经搭建了这样的控制台。它不仅仅是一个信息展示面板,更是一个 实时调参和性能诊断的入口。你可以添加更多的监控指标:

  • DrawCall 数量(衡量渲染批次效率)
  • GPU 内存使用量
  • 几何内核操作耗时(如布尔运算)
  • 射线拾取耗时

你甚至可以把这些数据绘制成实时曲线,一眼看出性能瓶颈。

4. 进阶集成:与渲染循环无缝结合

ImGui 的强大在于它不接管你的窗口和渲染上下文。你只需在每一帧:

  1. 调用 NewFrame()
  2. 编写 UI 代码
  3. 调用 Render() 生成绘制命令
  4. 将绘制命令提交给 OpenGL 渲染

它与你的 3D 渲染管线完全独立,互不干扰。你可以随时启用或禁用它,零侵入。

阶段二:让用户"说出来"------从按钮点击到自然语言指令

控制台有了,但用户还是得点鼠标

你的 ImGui 控制台确实让你爽了,但普通用户(设计师)看着满屏的数字和滑块,一脸茫然。他们说:"我不想学这些参数,我就想打个字,告诉 CAD 我想干嘛。"

你开始思考:能不能在控制台里加一个输入框,让用户直接打中文?

你动手在 ImGui 里加了一行:

cpp 复制代码
static char input_buffer[256] = "";
ImGui::InputText("指令", input_buffer, sizeof(input_buffer));
if (ImGui::Button("执行") && strlen(input_buffer) > 0) {
    ProcessCommand(input_buffer);
    memset(input_buffer, 0, sizeof(input_buffer));  // 清空输入框
}

用户终于可以打字了。但问题是,ProcessCommand 怎么写?

最朴素的实现:if-else 地狱

你一开始写的是:

cpp 复制代码
void ProcessCommand(const std::string& cmd) {
    if (cmd == "显示所有螺栓" || cmd == "show all bolts") {
        ShowAllBolts();
    } else if (cmd.find("隐藏") != std::string::npos) {
        HideEntities();
    } else if (cmd == "统计") {
        ShowStatistics();
    } else {
        std::cout << "未知指令: " << cmd << std::endl;
    }
}

用户输入"显示螺栓",能用。但用户输入"把螺栓都给我显示出来",你的程序就傻了。用户输入"show me the bolts",也不行(因为你不支持复杂的英文句式)。

你意识到,用户的语言是千变万化的,靠硬编码字符串匹配,根本覆盖不了所有表达方式。

你陷入了"if-else 地狱"------每增加一个功能,就得加一堆判断条件,代码越来越臃肿,越来越难维护。这正是很多"智能对话系统"的本质:关键词匹配 + if-else 地狱。

升级:关键词分发 + 语义槽(Semantic Slot)

你决定做一个更聪明的解析器。你不再精确匹配整句话,而是 提取关键词,识别"意图",再提取关键信息

你设计了一个简单的规则引擎:

cpp 复制代码
struct Command {
    std::string intent;  // 意图:"show", "hide", "analyze"
    std::map<std::string, std::string> slots;  // 槽位:{"target": "bolt", "color": "red"}
};

Command ParseCommand(const std::string& input) {
    Command cmd;
    
    // 意图识别(基于关键词)
    if (input.find("显示") != std::string::npos || 
        input.find("show") != std::string::npos) {
        cmd.intent = "show";
    } else if (input.find("隐藏") != std::string::npos || 
               input.find("hide") != std::string::npos) {
        cmd.intent = "hide";
    } else if (input.find("统计") != std::string::npos || 
               input.find("analyze") != std::string::npos) {
        cmd.intent = "analyze";
    }
    
    // 槽位提取(识别关键信息)
    if (input.find("螺栓") != std::string::npos || 
        input.find("bolt") != std::string::npos) {
        cmd.slots["target"] = "bolt";
    }
    if (input.find("红色") != std::string::npos || 
        input.find("red") != std::string::npos) {
        cmd.slots["color"] = "red";
    }
    // ... 更多槽位
    
    return cmd;
}

然后,你根据解析出的 intentslots,分发到对应的处理函数:

cpp 复制代码
void ExecuteCommand(const Command& cmd) {
    if (cmd.intent == "show") {
        if (cmd.slots.count("target")) {
            ShowEntitiesByType(cmd.slots.at("target"));
        }
    } else if (cmd.intent == "analyze") {
        auto* expert = GeometryExpert::GetInstance();
        if (cmd.slots.count("target") && cmd.slots.at("target") == "bolt") {
            expert->AnalyzeBolts();
        }
    }
}

现在,用户说"显示螺栓"、"把螺栓给我看看"、"show bolts"都能正确识别。你甚至支持了中英文混输!

这就是基于"意图识别 + 槽位填充"的规则式自然语言理解(Rule-based NLU)

这个版本的核心思想

你把这套逻辑整理清楚:把用户的自然语言,转换成结构化的 JSON 命令。比如:

用户输入:"统计所有螺栓"

程序内部解析成:

json 复制代码
{
    "intent": "analyze",
    "slots": {
        "target": "bolt",
        "action": "count"
    }
}

然后 GeometryExpert 收到这个 JSON,执行相应的几何分析算法,把结果反馈到 UI。

这个设计极其巧妙,因为它不仅解决了当前的问题,还为未来留了一扇门。

深度解析:自然语言交互的进化之路

1. 为什么先做"关键词分发"而不是直接接大模型 API?------端侧响应(On-Device Response)的智慧

你可能会问:现在 ChatGPT、DeepSeek 这么强,为什么不直接让大模型解析用户的自然语言?

答案是:在追求极致响应速度和用户隐私的场景下,本地规则引擎是更好的第一选择。

  • 零延迟:规则引擎是纯本地 C++ 代码,毫秒级响应。调用云端 API 至少需要几百毫秒的网络往返,用户拖动滑块时如果每次都要等网络,体验会非常糟糕。
  • 离线可用:工厂车间的工控机可能根本没有外网连接。你的 CAD 必须在完全断网的情况下正常工作。
  • 隐私安全:有些军工、航天图纸是涉密的,绝对不能上传到任何云端服务器。本地解析保证了"数据不出设备"。
  • 确定性 :规则引擎的输出是 完全可预测的------同样的输入永远得到同样的输出。而大模型是非确定性的(同样的 prompt 可能得到不同结果),这在需要精确控制的 CAD 环境中是隐患。

2. 语义槽(Semantic Slot):结构化的艺术

什么是"槽位"?你可以把它想象成一个"填空题的空白":

  • 意图:"我要订一张从 ___ 到 ___ 的机票,日期是 ___。"
  • 槽位:from_cityto_citydate

在 CAD 场景中,槽位可以是:

  • target:螺栓、孔、圆柱面
  • action:统计、高亮、隐藏、修改
  • color:红色、蓝色、绿色
  • size:M12、直径 10

规则引擎的任务,就是从用户的自然语言中"抽取"这些槽位的值。

3. 为大模型做铺垫:这套 JSON 指令集就是标准的 Function Calling 结构

你定义的 JSON 指令格式------{"intent": "...", "slots": {...}}------其实和业界大模型的 Function Calling(函数调用) 机制如出一辙。

Function Calling 的工作流程:

  1. 开发者向大模型注册一组"可用函数",包括函数名、描述、参数定义(JSON Schema)。
  2. 用户输入自然语言。
  3. 大模型判断用户意图,如果需要调用某个函数,它会输出一个结构化的 JSON 对象,包含函数名和参数。
  4. 开发者收到这个 JSON,执行真正的函数,把结果返回给大模型。
  5. 大模型根据结果生成最终的自然语言回复。

你的 JSON 指令集,本质上就是 本地版的 Function Calling 。未来你想接入 DeepSeek 或 GPT-4 时,只需要做一件事:把用户的输入发给大模型,让大模型返回这个 JSON,然后调用你已有的 ExecuteCommand 函数。其他代码几乎不用改!

这就像你提前修好了一条高速公路,现在跑的是自行车(规则引擎),但路基已经能承载 F1 赛车(大模型)了。

4. 规则式 NLU 的局限

当然,规则引擎也有天花板:

  • 只能识别你预定义的词。用户说"把那个银色的六角的东西给我看看",它可能听不懂"六角的东西"就是螺栓。
  • 无法处理复杂的指代和上下文。"把那个东西移过去"------"那个"是什么?你需要在代码里维护对话状态,非常复杂。
  • 维护成本高。每增加一个新功能,都得手动加一堆关键词。

这些局限,正是未来引入大模型要解决的问题。但作为 第一版,本地规则引擎已经足够好用,而且为未来的升级铺平了道路。

阶段三:从"命令解析器"到"几何专家"------连接 UI 与算法

命令分发到 GeometryExpert

你定义好了 JSON 指令格式后,需要把它真正执行出来。你在项目中设计了一个单例类 GeometryExpert,专门负责几何分析算法:

cpp 复制代码
class GeometryExpert {
public:
    static GeometryExpert* GetInstance();
    
    // 对外暴露的统一执行接口
    void ExecuteCommand(const std::string& json_str);
    
    // 具体的分析函数
    void AnalyzeBolts();           // 统计所有螺栓
    void AnalyzeHoles();           // 统计所有孔特征
    void CheckInterferences();     // 干涉检测
    void ComputeBoundingBox();     // 计算包围盒
    void HighlightEntitiesByType(const std::string& type);  // 高亮特定类型的实体
    
private:
    GeometryExpert() = default;
    // 内部数据结构:已加载的 B-Rep 实体列表等
};

ProcessCommand 解析出 JSON 后,就调用 GeometryExpert::ExecuteCommandGeometryExpert 根据 intentslots,执行相应的算法,比如:

  • 如果用户说"统计螺栓",GeometryExpert 会遍历所有实体,找出类型为"螺栓"的(可能是通过识别六角头+圆柱杆的几何特征,或者是通过块引用名称),返回数量和列表。
  • 如果用户说"检查干涉",GeometryExpert 会调用 Open CASCADE 的布尔干涉检测 API(BRepExtrema_DistShapeShape),找出所有相互穿透的零件。

结果反馈到 UI 界面

执行完毕后,结果需要返回给用户。你有两种反馈方式:

方式一:ImGui 文本输出

在控制台窗口加一个"输出日志"区域:

cpp 复制代码
static std::vector<std::string> log_messages;
ImGui::BeginChild("Log", ImVec2(0, 100), true);
for (const auto& msg : log_messages) {
    ImGui::TextUnformatted(msg.c_str());
}
ImGui::EndChild();

GeometryExpert 执行完分析后,把结果字符串 push 到 log_messages 中,控制台立刻显示。

方式二:3D 视口高亮

对于"显示所有螺栓"这类指令,分析结果直接在 3D 视口中体现------所有螺栓被高亮显示(比如描边或变色)。GeometryExpert 计算出需要高亮的实体 ID 列表,交给 RenderManagerRenderManager 在下一帧渲染时应用高亮效果。

这样,用户说一句话,控制台显示统计信息,3D 视口高亮对应的零件------一个完整的"自然语言→分析→可视化"闭环就形成了。

故事还未结束:你的 CAD 已经为 AI 时代准备好了

你靠在椅背上,看着这个新增的 ImGui 控制台,心里有一种说不出的踏实。

现在,你不仅能实时看到程序内部的每一个指标,用户还能用自然语言来控制 CAD 了。更重要的是,你设计的那套 JSON 指令集,本质上就是一个 本地版的 Function Calling 接口。它现在跑的是规则引擎,但架构已经完全兼容大模型。

你甚至可以想象未来的场景:

  • 用户说:"帮我找出所有干涉的零件,并生成一份报告。"
  • 你的 CAD 内部,GeometryExpert 执行干涉检测,生成报告,显示在 UI 上。
  • 如果你接入了 DeepSeek,用户甚至可以说:"我觉得这个发动机太重了,你能帮我优化一下吗?"大模型理解意图后,输出一连串的 JSON 指令序列:先分析材料分布,再建议减重方案,最后生成新的几何参数。

你突然明白,你写的不是 CAD 软件,而是在建造一个"CAD 操作系统"------一个能让人和 AI 共同操控几何世界的平台。

而这一切的起点,不过是你在 ImGui 里加了一个输入框,和一个简单的关键词匹配函数。

深度扩展:从规则引擎到 AI Agent 的完整技术栈

1. 意图识别与槽位填充的工业级方案

当你从"关键词匹配"升级到真正的"自然语言理解"时,有几种技术路线:

方案 技术栈 优点 缺点
规则式 正则表达式 + 词典 零延迟、可解释、离线 覆盖面窄、难维护
传统机器学习 TF-IDF + 逻辑回归 / CRF 可训练、覆盖更广 需要标注数据、特征工程复杂
深度学习 BiLSTM + CRF / BERT 理解语义、泛化强 需要 GPU、模型较大
大模型 API GPT-4 / DeepSeek Function Calling 零样本、理解力最强 依赖网络、成本高、隐私风险

你的项目目前处于"规则式",但架构已经兼容"大模型 API"。未来可以根据场景选择:高频、隐私敏感的操作用本地规则引擎;复杂、偶发的操作调用云端大模型。这就是"混合智能"架构。

2. Function Calling 深度解析

Function Calling 是大模型从"聊天者"变成"行动者"的关键技术。它的核心价值在于 解决了 LLM"只能说不能做"的局限------传统大模型能告诉你一个完美的旅游方案,但没法帮你订机票;有了 Function Calling,它可以调用外部的订票 API 真正完成操作。

标准工作流程:

  1. 开发者注册函数:告诉模型你有哪些"工具",每个工具叫什么、做什么、需要什么参数(JSON Schema 格式)。
  2. 用户发送请求:用户输入自然语言,隐含需要外部操作。
  3. 模型判断并生成调用请求 :模型理解意图后,如果决定调用某个工具,就输出一个结构化的 JSON,包含 name(函数名)和 arguments(参数)。
  4. 开发者执行函数:你的代码解析这个 JSON,调用真正的函数(查数据库、发邮件、调用 CAD API),拿到结果。
  5. 结果返回给模型:你把函数执行结果(也是 JSON 格式)发回给模型。
  6. 模型生成最终回复:模型结合原始对话和函数执行结果,生成用户友好的自然语言回复。

在 CAD 中的应用场景:

  • 用户说:"帮我把所有红色的螺栓改成蓝色。"
  • 模型输出:{"name": "change_color", "arguments": {"target_type": "bolt", "old_color": "red", "new_color": "blue"}}
  • 你的 GeometryExpert 执行 change_color 函数,遍历所有红色螺栓,改颜色。
  • 结果返回:{"status": "success", "count": 47}
  • 模型生成回复:"已成功将 47 个红色螺栓改为蓝色。"

整个过程中,大模型负责"理解"和"表达",你的 CAD 核心负责"执行"。两者各司其职,完美协作。

3. 端侧大模型:未来的方向

如果你既想要大模型的理解能力,又不希望数据上传云端,还有一个选项:端侧部署小型语言模型(SLM)

小型语言模型(如 Phi-3、TinyLlama、Qwen2.5-Coder-1.5B)经过量化和剪枝后,可以部署在本地 PC 甚至嵌入式设备上:

  • 模型压缩技术:权重量化(FP32→INT8/INT4)、知识蒸馏(用大模型教小模型)、权重剪枝(删除不重要的连接)。
  • 推理引擎:ONNX Runtime、llama.cpp、MLC LLM 等可以在纯 CPU 上运行小模型。
  • 优势:完全离线、零隐私风险、毫秒级推理延迟。
  • 局限:模型能力弱于 GPT-4,需要针对特定领域(如 CAD 指令)做微调。

你的项目目前用规则引擎,但未来完全可以尝试在本地部署一个微调过的 SLM,实现"端侧 AI CAD"。

4. 多模态交互:不止于文字

前沿的 CAD 自然语言交互,已经超越了纯文字。学术界的 CADialogue 系统支持 文本、语音、图像、选择 四种模态混合输入------用户可以说"把这个面拉伸 10mm",同时用鼠标点击选中那个面,系统结合语言和选择来精确执行操作。

这意味着,你的控制台未来可以扩展:

  • 语音输入(集成语音识别 SDK)
  • 图片输入(用户拍一张草图,AI 识别并生成 CAD 模型)
  • 上下文选择(用户选中一个面,然后说"倒角",系统自动理解是对选中面进行倒角操作)

5. 规则引擎 vs 大模型:什么时候用哪个?

一张对比表帮你理清思路:

维度 本地规则引擎 云端大模型 (LLM)
响应延迟 <1ms(C++ 原生) 200-2000ms(网络+推理)
确定性 100% 可预测 非确定,可能产生幻觉
隐私 数据不出设备 数据上传云端,有风险
离线可用
理解能力 仅限预定义规则 理解复杂语义、上下文
维护成本 高(每次加功能都要写规则) 低(改 prompt 即可)
运行成本 几乎为零 API 按 token 计费

最佳实践:高频、隐私敏感、需要精确控制的操作(如"显示螺栓"、"统计孔数量")用本地规则引擎;低频、复杂语义、探索性的操作(如"帮我分析这个零件的受力薄弱点")调用云端大模型。

这就是"混合智能"架构------用规则引擎保证底线的稳定和速度,用大模型拓展能力上限。


相关推荐
-许平安-2 小时前
MCP项目笔记十二(RAG-MCP)
c++·笔记·llm·rag·mcp
树獭非懒2 小时前
Harness Engineering:为什么你的 AI 不好用,其实不是模型的问题
人工智能·程序员·llm
晨欣2 小时前
LLM 推理性能指标全解:TTFT、TBT、Output Speed、Throughput、SLO 怎么用(GPT-5.4-high生成)
人工智能·gpt·llm
chaors7 小时前
LangGraph 入门到精通0x02:基础 API (二)
langchain·llm·agent
杨艺韬10 小时前
Vite内核解析-第17章 Web Worker 与特殊资源
agent
杨艺韬10 小时前
Vite内核解析-第16章 Environment API
agent
杨艺韬10 小时前
Vite内核解析-第12章 静态资源处理
agent
杨艺韬10 小时前
Vite内核解析-第15章 SSR 与模块运行器
agent
杨艺韬10 小时前
Vite内核解析-第13章 Rolldown 构建引擎
agent