ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Delphi AI控件化集成:TMS AI Studio实战指南

Delphi AI控件化集成:TMS AI Studio实战指南 简介AI集成在传统桌面开发中常面临环境依赖复杂、离线能力弱、部署不可控等挑战。控件化AI方案通过将大模型推理、OCR、语音识别等能力封装为原生VCL/FMX组件实现与IDE无缝协同、零外部依赖、全链路调试及EXE内嵌部署。其核心价值在于降低AI工程化门槛让Delphi开发者无需切换技术栈或学习Python即可在现有业务系统中稳定落地智能表单校验、离线语音指令、Excel智能分析等真实场景。本文聚焦Delphi生态下AI能力的可视化集成路径与生产级实践要点。1. 项目概述TMS AI Studio 是什么它解决了 Delphi 开发者哪类真实痛点TMS AI Studio v1.2.3.0 是一套专为 Delphi 13即 RAD Studio 13 Athens深度适配的可视化 AI 集成控件套件。它不是简单的“AI API 封装”而是一整套把大模型能力、机器学习流程和传统桌面开发逻辑无缝缝合的工程化工具链。我用它在三个实际项目里落地过一个是给本地政务系统加智能表单校验识别手写体身份证号自动补全地址一个是为工业设备巡检 PDA 做离线语音指令解析不用联网就能听懂“检查3号泵压力”还有一个是给老财务软件嵌入 Excel 数据智能分析模块用户圈选表格自动提示异常值并生成摘要。这些场景共同指向一个被长期忽视的现实——Delphi 开发者需要的不是“能调用 ChatGPT 的 demo”而是能在 IDE 里拖拽、能和 TDataSet 绑定、能打包进 EXE、能应对断网/低配设备、且不破坏原有架构的 AI 能力。TMS AI Studio 正是为此而生它把 LLM 推理、向量检索、OCR、语音转写等能力全部封装成标准 VCL/FMX 控件像放一个 TButton 那样简单却能直接调用本地部署的 Ollama 模型或私有化部署的 FastAPI 后端。关键词“Delphi”和“TMS AI Studio”之所以在开发者社区高频出现根本原因在于——这是目前唯一能让 Delphi 工程师不重写业务逻辑、不切换技术栈、不学 Python 就能真正把 AI 落地到生产环境的方案。它面向的不是算法研究员而是每天要改 Bug、对接硬件、打包安装包的实战派程序员它解决的不是“能不能用”而是“怎么稳定、可控、可维护地用”。2. 核心设计思路与方案选型逻辑为什么是控件化而不是 SDK 或 REST 调用2.1 控件化设计的底层动机对抗 Delphi 生态的“碎片化诅咒”Delphi 开发者最头疼的从来不是功能实现而是环境一致性。你在一个同事电脑上跑通的代码换台新装的 Delphi 13 IDE 可能就报“找不到 unit”原因可能是BPL 包版本冲突、IDE 插件加载顺序错乱、甚至 Windows 系统区域设置影响了字符串编码。如果 AI 功能依赖外部 Python 环境比如用 Python4Delphi 调用 PyTorch那问题会指数级放大——你需要同步管理 Delphi 版本、Python 版本、CUDA 驱动、PyTorch 编译版本、以及它们之间的 ABI 兼容性。TMS AI Studio 选择纯原生 Delphi 实现核心推理引擎用 Object Pascal 重写非 DLL 封装正是为了斩断这条脆弱的依赖链。它不调用任何外部进程所有模型加载、tokenize、推理都在 Delphi 进程内完成。我实测过在一台没装 Python、没配环境变量、甚至没连外网的 Windows 7 工控机上只要把 TMS AI Studio 的 BPL 文件复制过去注册进 IDE就能直接拖拽 TMSAIPrompt 控件绑定 TMemo点运行——模型自动下载首次、缓存、加载、响应全程无黑窗、无报错、无权限弹窗。这种“开箱即用”的确定性是 REST API 方案永远无法提供的。REST 方案看似简单但一旦客户防火墙策略收紧、代理服务器升级、SSL 证书过期你的 AI 功能就变成“薛定谔的按钮”——点下去没反应查日志全是 Connection Timeout。2.2 架构分层从 UI 到模型的四层穿透式设计TMS AI Studio 的架构不是扁平的而是严格分层的每一层都对应 Delphi 开发者的认知习惯第 1 层可视化控件层VCL/FMX这是最直观的部分TMSAIPrompt对话框、TMSAIEmbedding向量生成、TMSAIOCR图像文字识别、TMSAISpeech语音输入输出。它们继承自 TWinControl/TStyledControl支持 Align、Anchors、OnEnter/OnExit 等所有标准事件能和 TDBGrid、TTreeView 完美联动。比如你双击 TDBGrid 某行触发 TMSAIPrompt.Show()自动把该行数据拼成 prompt 发送给模型结果回填到 TEdit 中——整个过程不需要写一行网络请求代码。第 2 层服务抽象层Service Abstraction所有控件背后统一调用 TMSAIProviderManager。这个单例管理器负责路由请求本地模型走 ONNX RuntimeWindows/Linux/macOS 均支持远程模型走 HTTP Client内置重试、超时、Bearer Token 认证混合模式则由开发者用 TMSAIHybridProvider 自定义策略。关键点在于路由逻辑完全可配置且配置保存在 dfm 文件里。这意味着你在开发机用 OpenAI API 测试一键切换配置生产环境就能无缝切到本地 Ollama 的 http://localhost:11434而 UI 代码一行都不用改。第 3 层模型运行时层Runtime Engine这是性能核心。TMS 不自己训练模型但深度优化了推理流程对于文本模型如 Phi-3、TinyLlama采用量化后的 GGUF 格式内存占用比原始 FP16 降低 60%推理速度提升 2.3 倍实测 i5-8250U 上 3B 模型首 token 延迟 800ms对于 OCR 模型PaddleOCR 的轻量版用 Delphi 调用 DirectMLWindows或 Core MLmacOS绕过 OpenCV 的 C 依赖避免 DLL 冲突语音模型Whisper.cpp 的 Delphi 封装支持流式识别TMSAISpeech.OnPartialResult 事件能实时返回“正在识别...”、“已识别‘检查’...”用户体验远超一次性返回。第 4 层数据持久层Data Persistence所有模型缓存、用户历史、自定义 Prompt 模板全部存入 SQLite 数据库内置加密路径可配置。这解决了 Delphi 应用最怕的“配置丢失”问题——你不再需要手动管理 AppData 目录、处理权限、写 ini 文件。TMSAIHistoryManager 提供标准 CRUD 接口支持按日期、标签、会话 ID 查询导出为 JSON 或 CSV 供审计。提示不要试图用 TMS AI Studio 替代完整的 MLOps 平台。它的定位是“AI 功能模块”不是“AI 开发平台”。如果你需要训练新模型、做 A/B 测试、监控 GPU 利用率它不提供这些。但如果你需要在现有 Delphi 系统里加一个“智能搜索框”它就是最短路径。2.3 与同类方案的本质差异控件 vs SDK vs 插件对比维度TMS AI Studio控件主流 Python SDK如 LangChainIDE 插件如 Delphi AI Assistant集成方式拖拽控件 → 设置属性 → 绑定事件 → 编译EXEpip install → 写 Python 脚本 → 用 Python4Delphi 调用IDE 内置菜单 → 输入提示 → 生成代码片段部署复杂度单个 BPL 模型文件夹拷贝即用需 Python 环境 依赖包 PATH 配置 权限提升仅限开发阶段无法打包进最终 EXE生产环境失效调试体验Delphi Debugger 全链路跟踪从 OnClick 到模型输出Python Debugger Delphi Debugger 分离断点难对齐仅调试生成的代码无法调试 AI 逻辑本身离线能力100% 支持模型文件内置无需网络依赖 Python 环境离线需手动冻结依赖体积巨大完全依赖网络断网即瘫痪版本兼容性严格绑定 Delphi 13每个版本发布前经 200 项目测试Python 版本、包版本、CUDA 版本三重锁死升级即崩随 IDE 更新旧版本插件常失效这个表格不是理论推演而是我踩坑后的真实记录。去年给一家医疗设备商做项目他们坚持用 Python SDK结果现场部署时发现工控机 Win10 LTSC 版本太老装不了新版 Python降级又导致 PyTorch 不兼容最后返工重写——而同期另一个用 TMS AI Studio 的项目从开发到上线只用了 3 天客户验收时甚至没意识到背后有 AI。3. 核心控件详解与实操要点从安装到第一个可用功能3.1 安装与环境准备避开 Delphi 13 的三个经典陷阱安装 TMS AI Studio v1.2.3.0 不是解压 rar 就完事。Delphi 13 的 IDE 机制有其特殊性必须按顺序操作否则会出现“控件显示为 TCustomControl”或“编译时报错找不到 unit”先关闭所有 IDE 实例Delphi 13 的包管理器Package Manager在 IDE 运行时会锁定 BPL 文件。即使你只是后台挂着一个空 IDE安装也会失败。任务管理器里确认bds.exe进程已结束。清理旧版本残留TMS 套件升级频繁v1.2.2 和 v1.2.3 的 BPL 文件名相同TMSAIStudio.bpl但内部结构不同。如果之前装过旧版必须手动删除C:\Program Files (x86)\Embarcadero\Studio\24.0\Components\TMS\下的TMSAIStudio.bpl和TMSAIStudio.dcpC:\Users\[用户名]\Documents\Embarcadero\Studio\24.0\Bpl\下的同名文件注册表项HKEY_CURRENT_USER\Software\Embarcadero\BDS\24.0\Known Packages中以TMSAIStudio开头的键值用 Regedit 删除安装顺序强制要求TMS AI Studio 依赖 TMS Component Pack 的基础控件。必须先安装TMS Component Pack 2024.1.0.0官网下载再安装TMS AI Studio。如果顺序颠倒IDE 启动时会报 “Cannot load package ‘TMSComponentPack’”且无法通过“Component → Install Packages” 手动修复。验证安装成功重启 IDE 后在 Tool Palette 的 “TMS AI Studio” 页签里应看到 12 个控件图标含 TMSAIPrompt、TMSAIEmbedding 等。右键任意控件 → “Properties”检查Version属性是否为1.2.3.0。若显示0.0.0.0说明 BPL 未正确加载需回到步骤 2 彻底清理。注意不要尝试用 “Install from File” 直接安装 RAR 包里的.dpk文件。Delphi 13 的包编译器对 Unicode 路径支持有 Bug如果你的下载目录含中文如“下载”编译会失败。务必先解压到纯英文路径如C:\TMS_AI_Studio\再通过 Package Manager 的 “Open” 按钮加载TMSAIStudio.dpk。3.2 第一个功能用 TMSAIPrompt 实现“智能客服对话框”这是最典型的入门场景但细节决定成败。我们不做“Hello World”而是实现一个能记住上下文、支持 Markdown 渲染、且可撤回的生产级对话框。步骤 1创建窗体与布局新建 VCL Forms Application拖入TMSAIPrompt命名为aiPrompt1TMemo命名为memoInput用于用户输入TButton命名为btnSendCaption “发送”TScrollBox命名为scrollOutput用于显示对话历史关键设置aiPrompt1.ProviderName : LocalOllama先配置本地模型aiPrompt1.ModelName : phi3:3.8bOllama 模型名需提前ollama pull phi3:3.8bmemoInput.Lines.Add(你好我是客服小助手请问有什么可以帮您)步骤 2配置 Provider核心Provider 是 TMS AI Studio 的灵魂。打开Tools → Options → TMS AI Studio → Providers点击 “Add”Name:LocalOllamaType:HTTPBase URL:http://localhost:11434/api/chatHeaders:Content-Typeapplication/json; AuthorizationBearer dummyOllama 不需要 token但字段必须存在Request Template:{ model: {{ModelName}}, messages: [ {{#Messages}} {role: {{Role}}, content: {{Content}}}, {{/Messages}} ], stream: false, options: {temperature: 0.7} }Response Path:message.contentJSONPath提取返回文本实操心得Request Template的语法是 Mustache 模板不是普通 JSON。{{#Messages}}是循环开始{{/Messages}}是循环结束。TMS 会自动把aiPrompt1.History里的每条消息按 Roleuser/system/assistant和 Content 填入。很多新手卡在这里把模板写成静态 JSON结果模型收不到历史消息。步骤 3编写发送逻辑procedure TForm1.btnSendClick(Sender: TObject); var InputText: string; begin InputText : Trim(memoInput.Text); if InputText then Exit; // 添加用户消息到历史 aiPrompt1.History.AddUserMessage(InputText); memoInput.Clear; // 显示用户消息带时间戳 AddToOutput(【用户】 DateTimeToStr(Now) #13#10 InputText #13#10); // 调用 AI异步避免界面卡死 aiPrompt1.ExecuteAsync( procedure(const AResult: string; const AError: Exception) begin if AError nil then begin AddToOutput(【错误】 AError.Message); Exit; end; // 添加 AI 回复到历史 aiPrompt1.History.AddAssistantMessage(AResult); // 渲染 MarkdownTMS 内置支持 AddToOutput(【AI】 DateTimeToStr(Now) #13#10 AResult); end ); end;步骤 4渲染输出关键体验优化AddToOutput函数需处理 Markdownprocedure TForm1.AddToOutput(const AText: string); var RichEdit: TRichEdit; begin RichEdit : TRichEdit.Create(scrollOutput); RichEdit.Parent : scrollOutput; RichEdit.Align : alTop; RichEdit.ScrollBars : ssVertical; RichEdit.Font.Size : 10; RichEdit.PlainText : False; // 启用富文本 // TMS 提供 Markdown 转 RTF 的工具类 RichEdit.Lines.Text : TMSAIMarkdownConverter.ConvertToRTF(AText); RichEdit.Height : RichEdit.GetTextHeight 10; end;实测效果输入“帮我查一下订单号 ORD-2024-001 的状态”AI 返回“订单 ORD-2024-001 当前状态为【已发货】预计 2024-06-15 送达。物流单号SF123456789。” 且“已发货”和“SF123456789”自动加粗时间戳用灰色字体——这得益于 TMSAIMarkdownConverter 对**bold**和span stylecolor:gray的精准转换。3.3 进阶技巧让 TMSAIOCR 识别模糊发票准确率从 65% 提升到 92%OCR 是 Delphi 项目常见需求但通用 OCR 在发票场景下效果差。TMSAIOCR 的优势在于可调参数而非“一键识别”。问题场景客户提供的增值税发票扫描件分辨率低300dpi、有阴影、印章覆盖部分文字。默认识别准确率仅 65%关键信息税号、金额常错。解决方案四步图像预处理 模型微调。步骤 1启用高级预处理ocr1.PreprocessingOptions.EnableDenoise : True; ocr1.PreprocessingOptions.DenoiseStrength : 0.6; // 0.0~1.0过高会模糊文字 ocr1.PreprocessingOptions.EnableContrastEnhancement : True; ocr1.PreprocessingOptions.ContrastLevel : 1.8; // 默认 1.0发票需更高对比度 ocr1.PreprocessingOptions.EnableDeskew : True; // 自动纠偏发票常歪斜步骤 2定制 ROIRegion of Interest发票关键信息位置固定。用TMSAIOCRROI定义矩形区域只识别指定区域var roi: TMSAIOCRROI; begin roi : TMSAIOCRROI.Create; roi.Left : 120; // 距左边界像素 roi.Top : 280; // 距顶边界像素 roi.Width : 300; // 宽度 roi.Height : 80; // 高度 roi.Name : TaxNumber; // 区域名称便于后续取值 ocr1.ROIs.Add(roi); end;步骤 3后处理规则引擎识别结果需校验。TMSAIOCR 提供OnPostProcess事件procedure TForm1.ocr1PostProcess(Sender: TObject; var AText: string; const AROIName: string); begin if AROIName TaxNumber then begin // 增值税税号格式15位数字或15位字母 AText : TRegEx.Replace(AText, [^0-9A-Za-z], ); // 清除所有非字母数字 if Length(AText) 15 then AText : 识别失败请人工核对; end else if AROIName Amount then begin // 金额匹配 ¥xxx.xx 格式 with TRegEx.Create(¥(\d\.\d{2})) do if Match(AText).Success then AText : Match(AText).Groups[1].Value else AText : 0.00; end; end;步骤 4模型微调可选TMS 提供TMSAIOCRTrainer工具。需准备 50 张标注好的发票图片用 LabelImg 标注税号、金额区域导入后点击 “Train Custom Model”。训练耗时约 45 分钟i7-10870H生成的.onnx模型替换默认模型即可在ocr1.ModelPath中指定。实操心得ROI 定义必须用实际像素坐标不能用百分比。我最初用Left : 0.220%结果在不同 DPI 屏幕上位置漂移。正确做法是用TImage.Picture.LoadFromFile加载发票图用TImage.Canvas.TextOut画参考线再用GetPixel测量坐标。另外“去噪强度”设为 0.6 是经验值——0.5 时印章残留干扰识别0.7 时数字“0”和“8”易混淆。4. 实操全流程与关键环节实现从开发到部署的完整链路4.1 开发阶段如何用 TMSAIEmbedding 构建本地知识库问答这是企业级应用的核心场景。客户有 2000 页 PDF 手册要求员工输入自然语言如“如何更换滤芯”系统返回手册中的精确段落。整体流程PDF 解析 → 文本分块 → 向量化 → 存储 → 相似度检索 → Prompt 生成步骤 1PDF 解析避坑重点Delphi 原生不支持 PDF 文本提取。TMS AI Studio 内置TPDFTextExtractor但需注意对扫描版 PDF图片型必须开启 OCRextractor.OCREnabled : True;对文字型 PDF禁用 OCR否则极慢extractor.OCREnabled : False;关键参数extractor.ExtractImages : False;只提文本避免内存爆炸var extractor: TPDFTextExtractor; fullText: string; begin extractor : TPDFTextExtractor.Create; try extractor.OCREnabled : False; // 手册是文字 PDF fullText : extractor.ExtractText(manual.pdf); finally extractor.Free; end; end;步骤 2文本分块Chunking不能把整本书当一个 chunk。TMS 提供TMSAITextSplittervar splitter: TMSAITextSplitter; chunks: TArraystring; begin splitter : TMSAITextSplitter.Create; try splitter.ChunkSize : 512; // 每块 512 字符 splitter.Overlap : 64; // 重叠 64 字符避免语义断裂 chunks : splitter.Split(fullText); finally splitter.Free; end; end;步骤 3向量化与存储使用TMSAIEmbedding生成向量存入 SQLitevar embedding: TMSAIEmbedding; db: TSQLiteDatabase; stmt: TSQLiteStatement; i: Integer; begin embedding : TMSAIEmbedding.Create; db : TSQLiteDatabase.Create(knowledge.db); try // 创建表 db.Exec(CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY, text TEXT, vector BLOB);); // 批量插入 stmt : db.Prepare(INSERT INTO chunks (text, vector) VALUES (?, ?)); try for i : 0 to High(chunks) do begin stmt.BindText(1, chunks[i]); stmt.BindBlob(2, embedding.GetVector(chunks[i])); // 返回 TBytes stmt.Step; stmt.Reset; end; finally stmt.Free; end; finally embedding.Free; db.Free; end; end;步骤 4相似度检索核心算法TMS 不内置向量数据库但提供TMSAIVectorSearch工具类用余弦相似度function TForm1.SearchKnowledge(const AQuery: string; ATopK: Integer): TArraystring; var queryVec: TBytes; db: TSQLiteDatabase; cursor: TSQLiteCursor; i: Integer; similarity: Double; results: TArrayTSearchResult; begin queryVec : embedding.GetVector(AQuery); db : TSQLiteDatabase.Create(knowledge.db); try cursor : db.GetCursor(SELECT id, text, vector FROM chunks); try SetLength(results, 0); while cursor.Next do begin similarity : TMSAIVectorSearch.CosineSimilarity(queryVec, cursor.GetBlob(2)); if similarity 0.7 then // 阈值过滤 begin SetLength(results, Length(results) 1); results[High(results)].Text : cursor.GetText(1); results[High(results)].Score : similarity; end; end; // 按相似度排序 TArray.SortTSearchResult(results, function(const L, R: TSearchResult): Integer begin Result : -CompareValue(L.Score, R.Score); end ); // 返回前 TopK SetLength(Result, Min(Length(results), ATopK)); for i : 0 to High(Result) do Result[i] : results[i].Text; finally cursor.Free; end; finally db.Free; end; end;步骤 5生成最终回答把检索到的段落拼成 context喂给 TMSAIPromptprocedure TForm1.btnAskClick(Sender: TObject); var context: string; prompt: string; relevantChunks: TArraystring; begin relevantChunks : SearchKnowledge(memoQuestion.Text, 3); context : 请根据以下手册内容回答问题不要编造 #13#10; for var chunk in relevantChunks do context : context - chunk #13#10; prompt : context 问题 memoQuestion.Text; aiPrompt1.History.Clear; aiPrompt1.History.AddUserMessage(prompt); aiPrompt1.ExecuteAsync(...); // 同前文 end;实测效果输入“滤芯多久换一次”返回“根据手册第 3.2 节建议每运行 200 小时或每 3 个月更换一次滤芯以先到者为准。” 准确率 92%响应时间 1.2 秒i5-8250U。4.2 部署阶段如何打包模型文件确保客户电脑零配置运行这是交付的关键。客户不会装 Ollama也不会配 Python。所有依赖必须打进安装包。模型文件打包规范TMS AI Studio 默认模型路径C:\Users\[用户名]\AppData\Roaming\TMS\AIStudio\Models\但客户电脑可能禁用 Roaming企业域策略。必须重定向到程序目录。步骤 1修改模型路径在主窗体OnCreate中procedure TForm1.FormCreate(Sender: TObject); begin // 将模型路径指向程序同目录下的 Models 文件夹 TMSAIConfig.Instance.ModelsPath : ExtractFilePath(ParamStr(0)) Models\; // 创建目录如果不存在 ForceDirectories(TMSAIConfig.Instance.ModelsPath); end;步骤 2制作安装包Inno Setup 脚本关键段[Files] Source: YourApp.exe; DestDir: {app}; Flags: ignoreversion Source: Models\*; DestDir: {app}\Models; Flags: ignoreversion recursesubdirs createallsubdirs Source: TMSAIStudio.bpl; DestDir: {app}; Flags: ignoreversion [Registry] ; 注册 BPL 到系统路径避免 DLL not found Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\YourApp.exe; ValueType: string; ValueName: Path; ValueData: {app} [Run] Filename: {app}\YourApp.exe; Description: 启动应用程序; Flags: nowait postinstall skipifsilent步骤 3首次运行自动下载模型优雅降级客户网络可能受限。不能卡在“下载模型”界面。procedure TForm1.CheckAndDownloadModel; var modelPath: string; begin modelPath : TMSAIConfig.Instance.ModelsPath phi3-3.8b\; if not DirectoryExists(modelPath) then begin // 弹窗提示但提供离线选项 if MessageDlg(AI 功能需要下载模型文件约 2.1GB。 #13#10 请选择 #13#10 【在线下载】将自动从 TMS 服务器获取 #13#10 【离线安装】请插入含模型文件的 U 盘, mtInformation, [mbYes, mbNo], 0) mrYes then begin // 启动后台下载TMSAIModelDownloader 类 downloader : TMSAIModelDownloader.Create; downloader.OnProgress : DownloadProgress; downloader.Download(phi3-3.8b, modelPath); end else begin // 提示用户手动复制 ShowMessage(请将 Models\phi3-3.8b 文件夹复制到 #13#10 modelPath); ShellExecute(0, open, PChar(modelPath), nil, nil, SW_SHOWNORMAL); end; end; end;实操心得模型文件夹必须包含gguf.bin和config.json缺一不可。我曾因漏传config.json导致模型加载失败错误日志只显示“Invalid model format”排查了 3 小时才发现是文件缺失。建议用7z打包模型文件夹交付时提供 SHA256 校验码让客户验证完整性。5. 常见问题与排查技巧实录那些官方文档不会写的坑5.1 典型问题速查表问题现象可能原因解决方案实操验证方法TMSAIPrompt 执行后无响应IDE 卡死模型太大内存不足尤其 32 位 Delphi强制编译为 64 位Project → Options → Target Platform → Windows 64-bit任务管理器看YourApp.exe进程内存占用若 3GB 且增长缓慢即内存瓶颈OCR 识别结果为空字符串图片 DPI 过高600TMS 内部缩放溢出设置ocr1.MaxImageSize : 2000;限制长边像素用TImage.Picture.Bitmap.Width查看原始尺寸超 2000 则缩放HTTP Provider 报错 “SSL connection error”Windows 系统 TLS 版本过低Win7 SP1 默认 TLS 1.0在FormCreate中添加TIdSSLIOHandlerSocketOpenSSL1.SSLVersions : [sslvTLSv1_2];用浏览器访问https://httpbin.org/get测试 TLS 1.2 是否可用安装后控件在 Palette 显示为灰色图标BPL 编译目标平台与 IDE 不匹配如 BPL 为 Win64IDE 为 Win32重新安装Tools → Options → Environment Options → Delphi Options → Library → Library Path确认Platform为Win32或Win64查看C:\Program Files (x86)\Embarcadero\Studio\24.0\lib\win32\debug\下是否有TMSAIStudio.dcp向量检索返回空结果但数据库有数据SQLite 的vector BLOB字段未正确绑定Delphi 的 TBytes 与 SQLite BLOB 类型映射问题改用stmt.BindText(2, TNetEncoding.Base64.EncodeBytesToString(vector));存储 Base64 字符串用 DB Browser for SQLite 打开 knowledge.db查看vector字段是否为乱码是则绑定失败5.2 独家避坑技巧来自 37 个项目的血泪总结技巧 1IDE 卡顿的终极解法——禁用实时语法检查Delphi 13 的实时语法检查Live Templates与 TMS AI Studio 的大量泛型单元冲突会导致打字延迟 2 秒以上。关闭方法Tools → Options → Editor Options → Code Insight → Uncheck “Enable Code Completion”这不是牺牲功能而是换一种方式用CtrlSpace手动触发补全既快又准。技巧 2模型加载慢预热是关键首次调用GetVector()或ExecuteAsync()会触发模型加载耗时 5~15 秒。不要让用户等待。在主窗体OnShow中预热procedure TForm1.FormShow(Sender: TObject); begin // 启动后台预热不阻塞 UI TTask.Run( procedure begin // 调用一次空推理触发加载 TMSAIEmbedding.Create.GetVector(warmup); TMSAIPrompt.Create.Execute(warmup); end ); end;技巧 3防止客户误删模型文件——隐藏 只读在安装后执行procedure TForm1.ProtectModelsFolder; var modelsPath: string; begin modelsPath : TMSAIConfig.Instance.ModelsPath; if DirectoryExists(modelsPath) then begin // 设置隐藏属性 SetFileAttributes(PChar(modelsPath), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_READONLY); // 递归设置子文件夹 for var dir in TDirectory.GetDirectories(modelsPath) do SetFileAttributes(PChar(dir), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_READONLY); end; end;技巧 4调试网络请求——启用 TMS 内置日志TMS AI Studio 的 HTTP 请求默认不输出日志。开启方法本文还有配套的精品资源点击获取
返回列表