news 2026/5/4 12:18:35

Delphi/FPC AI开发实战:MakerAI Suite构建企业级智能应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Delphi/FPC AI开发实战:MakerAI Suite构建企业级智能应用

1. 项目概述:MakerAI Suite,一个为Delphi/FPC打造的完整AI应用生态

如果你是一名Delphi或Free Pascal开发者,最近想在自己的桌面或企业应用中集成AI能力,比如让软件能理解文档、自动处理流程,或者构建一个智能助手,那你很可能面临一个尴尬的局面:社区里能找到的库,大多只是对某个AI服务商API的简单HTTP封装。你需要自己处理复杂的对话上下文、工具调用、文件上传,更别提构建RAG知识库或多智能体工作流了——这些高级功能几乎都要从零开始。

MakerAI Suite的出现,彻底改变了这个局面。它不是一个简单的API包装器,而是一个为Delphi和Free Pascal量身定制的、完整的AI应用开发生态系统。我从v2.x版本开始关注并使用它,到如今的v3.3,亲眼看着它从一个优秀的聊天组件,成长为一个涵盖RAG、智能体、工具桥接、可视化UI的庞然大物。它的核心思想是:让Pascal开发者能用自己最熟悉的语言和范式(组件、事件、RTTI),去构建生产级的AI应用,而无需在Python生态和Delphi之间反复横跳。

简单来说,MakerAI让你能用拖放组件和编写Pascal代码的方式,实现其他语言需要复杂框架才能完成的任务。无论是连接最新的GPT-5.2、Claude 4.6,还是构建一个能检索内部知识库并自动审批的智能工作流,它都提供了一站式的原生解决方案。接下来,我将带你深入拆解这个套件的架构、核心功能,并分享从环境搭建到实战开发的全流程经验。

2. 核心架构与设计哲学:为何它不止是API调用

2.1 双轨制设计:直接控制与统一抽象的平衡

MakerAI最精妙的设计之一是它的“双轨制”访问模式。这解决了开发者面临的一个经典矛盾:既要追求对特定API的完全控制力,又希望业务逻辑代码能保持通用、可切换。

轨道一:原生提供者组件这是为需要“满血”API功能的场景准备的。例如,TAiOpenChatTAiClaudeChat等组件,提供了对应服务商API的全功能、原生映射。这意味着,如果OpenAI的Chat Completion接口有一个名为seed的参数,那么TAiOpenChat组件就一定会有一个对应的Seed属性。你可以精细控制每一次调用的温度、top_p、最大token数等所有参数,并直接获取API返回的原始数据结构。当你需要利用某个提供者的独有特性(比如OpenAI的JSON模式强制输出,或Claude的XML工具调用)时,就应该使用这些原生组件。

轨道二:统一连接器这是大多数应用场景的推荐入口:TAiChatConnection。它是一个通用的、提供者无关的接口。你的业务代码只与TAiChatConnection交互,而具体背后是OpenAI、Gemini还是Ollama,仅仅通过设置DriverNameModel属性来决定。这种抽象带来了巨大的灵活性:

  1. 环境隔离:API密钥可以通过@ENV_VAR语法从环境变量读取,避免将敏感信息硬编码在源码或配置文件中。
  2. 动态切换:你可以根据用户订阅、成本或模型特性,在运行时动态切换AI服务商,而无需重写任何对话逻辑。
  3. 降级容灾:当主要服务商出现故障时,可以快速回退到备用服务商。

在实际项目中,我通常采用混合策略:核心业务流使用TAiChatConnection以保证可移植性;而在某些对特定模型行为有强依赖的模块(例如,依赖Claude的长时间推理能力),则直接使用对应的原生组件。

2.2 能力系统:声明式需求与自动桥接

v3.3引入的TAiCapabilities系统是框架智能化程度的一个飞跃。传统上,你需要手动检查模型是否支持某功能(比如视觉识别),如果不支持,就得自己写代码调用外部工具(如OCR服务)来“补全”。这个过程繁琐且容易出错。

TAiCapabilities将这个过程自动化、声明化了。它包含两个核心集合:

  • ModelCaps:描述一个模型原生支持的能力,例如[cap_Text, cap_Image, cap_Reasoning]
  • SessionCaps:描述当前会话需要的能力,比如用户上传了一张图片并要求描述,那么会话就需要cap_Image能力。

框架会自动进行“缺口分析”。当SessionCaps超出了ModelCaps的范围,MakerAI不会报错,而是自动激活相应的“桥接工具”。例如,你向一个不支持图片理解的文本模型(如某些Ollama模型)发送图片,框架会检测到cap_Image缺口,自动调用配置好的IAiVisionTool(比如连接到一个支持视觉的模型)来处理图片,将结果转换为文本描述后,再发送给主模型。这一切对开发者是透明的,你只需要声明“我需要什么”,而不用关心“它怎么实现”。

此外,ThinkingLevel属性(tlLow,tlMedium,tlHigh)提供了一个跨提供者的统一推理深度控制接口。对于支持“扩展思考”的模型(如DeepSeek-Reasoner、Claude 3.7 Sonnet),设置更高的ThinkingLevel会触发模型更长时间的链式推理;对于不支持的模型,该属性则被忽略。这简化了为不同模型优化提示词的复杂度。

3. 核心模块深度解析与实战要点

3.1 RAG引擎:从向量检索到知识图谱

检索增强生成是让AI应用“拥有”私有知识的关键。MakerAI提供了两套互补的RAG引擎,远超简单的向量搜索。

向量RAG:语义搜索的工业级实现其核心是基于TAiVectorRAGConnection组件的向量数据库。它支持多种后端:

  • PostgreSQL/pgvector:适用于生产环境,支持大规模的向量索引和复杂的联表查询。
  • SQLite:轻量级选择,适合桌面应用或原型开发,无需单独部署数据库服务。
  • 内存模式:用于单元测试或极小数据量的瞬时检索。

它的强大之处在于混合搜索策略。单纯的向量相似度搜索(语义搜索)有时会错过关键关键词;而单纯的关键词匹配(BM25)又无法理解语义。MakerAI的向量RAG引擎可以同时执行两种搜索,并通过RRF(倒数排名融合)或加权分数融合算法,将两者的结果智能合并。这大大提高了检索的召回率和准确率。

VQL:像查询数据库一样检索知识这是MakerAI的一大亮点。你不再需要拼接复杂的函数调用,而是使用一种类似SQL的声明式语言——VQL(Vector Query Language)。

var VQL: string; Results: TArray<TAiVectorSearchResult>; begin VQL := 'MATCH documents SEARCH “项目进度延迟” ' + 'USING HYBRID WEIGHTS(semantic: 0.7, lexical: 0.3) FUSION RRF ' + 'WHERE department = “研发部” AND date > “2024-01-01” ' + 'RERANK “根本原因分析” WITH REGENERATE ' + 'LIMIT 5'; Results := VectorRAGConn.Query(VQL); end;

这段VQL语句的意思是:在documents集合中,搜索“项目进度延迟”,使用混合搜索(语义权重0.7,关键词权重0.3),结果用RRF算法融合。同时,筛选department为“研发部”且日期在2024年之后的文档。然后,用“根本原因分析”这个查询对初步结果进行神经重排序,以提升Top结果的相关性。最后返回5条最相关的结果。WITH REGENERATE选项允许重排序模型改写或扩充结果片段,使其更贴合查询意图。这种表达方式极其高效和直观。

图RAG:挖掘知识背后的关联如果说向量RAG找到了相关的“点”,那么图RAG则揭示了这些“点”之间的“线”。它将知识存储为节点(实体)和边(关系)组成的图结构,每个节点和边都可以有嵌入向量和属性。

例如,将公司文档提取后,可以形成(人员)-[属于]->(部门)(项目)-[依赖]->(技术)等关系。图RAG的强大查询语言GQL(Graph Query Language)允许你进行图遍历查询:

MATCH (p:Person)-[r:WORKS_ON]->(proj:Project) WHERE proj.status = “高风险” DEPTH 2 RETURN p.name, proj.name, r.role

这条查询会找出所有参与“高风险”项目的人员,并向外探索两层关系(比如这些人还参与了哪些其他项目)。这对于根因分析、影响面评估、知识发现等场景非常有用。新的uMakerAi.RAG.Graph.Documents.pas单元提供了完整的文档到知识图谱的流水线管理(摄取、分块、嵌入、链接),使得构建图RAG应用变得更加系统化。

实操心得:RAG的“分块”艺术RAG的效果很大程度上取决于文档分块(Chunking)策略。MakerAI提供了基础的分块器,但对于复杂文档(如混合了文本、表格、代码的PDF),默认策略可能不够。我的经验是:

  1. 按语义分块:优先使用基于句子或段落边界的语义分块,而不是固定大小的滑动窗口,这能保证上下文的完整性。
  2. 重叠区域:设置一定的重叠token数(如100-200),避免答案恰好被切分在两个块之间。
  3. 元数据丰富化:在分块时,尽可能为每个块添加丰富的元数据,如所属章节、页码、文档类型、重要性标签等。这些元数据可以在VQL的WHERE子句中用于强力过滤,极大提升检索精度。
  4. 对于图RAG:分块策略更侧重于“实体提取”和“关系定义”。你需要设计好从文本到节点/边的映射规则,这可能需要对领域有更深的理解。

3.2 智能体框架:构建可持久化的自动化工作流

MakerAI的智能体系统是基于有向图的,这比线性的链式调用强大得多。核心组件是TAIAgentManager,它负责执行一个由TAIAgentsNode(节点)和连接线构成的图。

节点与黑板每个TAIAgentsNode代表一个执行单元,它可以是一个LLM调用、一个工具调用(如计算器、数据库查询),或者一段自定义的Pascal代码。节点之间通过链接传递数据。TAIBlackboard是一个线程安全的键值存储,作为所有节点的共享内存。节点可以从黑板读取输入,并将输出写回黑板。这种设计使得节点之间松耦合,易于复用和组合。

链接模式与执行控制链接决定了工作流的走向:

  • lmFanout:广播。一个节点的输出会同时触发所有下游节点并行执行。
  • lmConditional:条件路由。根据上游节点的输出值或某个条件,决定下一步执行哪个分支。
  • lmExpression:表达式绑定。允许使用简单的表达式语言,将上游节点的输出值动态赋值给下游节点的输入参数。
  • lmManual:手动触发。用于需要人工干预的步骤。

持久化执行与人工介入这是v3.3的两个重磅特性,对于生产环境至关重要。

  1. TAiFileCheckpointer:智能体工作流可能很长,如果在执行中途程序崩溃或服务器重启,传统方式只能从头开始。检查点机制会将整个图的状态(每个节点的完成状态、黑板上的数据)序列化到磁盘。恢复时,TAIAgentManager可以从检查点文件加载,并自动从中断的节点继续执行,确保了长时间工作流的可靠性。
  2. TAiWaitApprovalToolOnSuspend事件:并非所有决策都应该交给AI。你可以插入一个“等待审批”节点。当工作流执行到此节点时,它会触发OnSuspend事件,并将自身线程ID、节点名和当前上下文(通常从黑板获取)暴露给你的UI层。你的应用程序可以弹出一个对话框让用户审核。用户做出“批准”或“拒绝”的决定后,调用ResumeThread方法,并传入决策结果,工作流便会继续执行。这实现了真正的“人在回路”控制。

3.3 MCP集成:与外部AI工具生态无缝对接

模型上下文协议是一个新兴但非常重要的标准,它允许AI应用(如Claude Desktop、Cursor)安全地调用外部工具(如文件系统、数据库)。MakerAI完整实现了MCP的客户端和服务器端。

作为MCP服务器:将你的Delphi应用能力暴露给AI通过TAiMCPServer组件,你可以轻松地将任何Delphi函数注册为MCP工具。例如,你可以暴露一个“查询本月销售数据”的工具。当用户在Claude Desktop中与你配置的MCP服务器连接后,他就可以直接对Claude说:“帮我查一下本月的销售数据”,Claude会自动调用你这个工具并返回结果。MakerAI支持HTTP、SSE和StdIO多种传输协议,并且提供了TAiFunctions到MCP工具的自动桥接,这意味着你现有的基于TAiFunctions的工具链几乎可以零成本转换为MCP服务。

作为MCP客户端:在你的应用中使用外部AI工具反过来,你也可以在你的Delphi应用中集成外部MCP服务器。例如,连接一个公开的天气数据MCP服务器,你的智能体就可以获得实时天气信息。TAiMCPClient组件处理了所有JSON-RPC通信的细节,你只需要提供服务器地址和工具列表,就可以像调用本地函数一样调用远程工具。

注意事项:MCP并发调用的坑在v3.3之前,MCP客户端在处理单个回合内多个工具调用时存在一个隐蔽的并发Bug。如果模型一次返回两个需要调用同一个MCP服务器的工具,框架会尝试并行执行它们。但由于一个MCP服务器实例通常共享一个进程/管道,并行调用会导致JSON-RPC消息交错,引发通信混乱和随机失败。v3.3通过在TMCPClientCustom中引入FCallLock: TCriticalSection修复了这个问题,确保对同一服务器的调用是串行的,而对不同服务器的调用仍可并行。这提醒我们,在集成异步工具调用时,必须仔细考虑资源竞争和线程安全。

3.4 ChatTools:弥补模型能力短板的瑞士军刀

ChatTools是一组标准化接口,将各种确定性能力(OCR、语音、图像生成、文件操作等)封装成AI可以调用的“工具”。其核心价值在于自动桥接

例如,你的会话需要cap_Pdf能力来读取一份PDF合同,但你当前使用的模型(比如GPT-3.5)并不原生支持PDF解析。在传统方式下,你需要手动编写代码:先调用一个OCR服务解析PDF,再将文本传给GPT。而使用MakerAI,你只需要:

  1. 配置一个IAiPdfTool的实现(例如,使用Mistral的OCR API)。
  2. 在会话中声明需要cap_Pdf能力。
  3. 当用户上传PDF时,框架会自动检测到模型能力缺口,并调用你配置的IAiPdfTool进行转换,整个过程对开发者透明。

这种模式极大地降低了集成复杂度。目前支持的Tool包括PDF解析、视觉识别、语音合成与识别、网页搜索、图像/视频生成、Shell命令执行、文件编辑,甚至鼠标键盘控制(Computer Use)。你可以混合使用多个工具,让一个“能力平平”的模型,通过工具链的辅助,完成复杂的多模态任务。

4. 从零开始:安装、配置与第一个AI对话应用

4.1 环境准备与源码获取

首先,你需要一个支持Delphi 10.4 Sydney或更高版本(推荐11 Alexandria以上)的IDE,或者使用Free Pascal 3.2.0+配合Lazarus。MakerAI对Free Pascal的支持非常完善,所有核心功能在fpc分支上均可使用。

通过Git克隆项目是第一步:

git clone https://github.com/gustavoeenriquez/MakerAi.git

我建议创建一个独立的目录来存放这个库,例如D:\Dev\Libs\MakerAI,以便管理。

4.2 包编译顺序与库路径设置

这是新手最容易出错的地方。MakerAI由多个运行时包和一个设计时包组成,必须按顺序编译

  1. 打开Delphi,选择File -> Open Project,导航到MakerAi\Source\Packages\目录。
  2. 按顺序打开并编译安装
    • MakerAI.dpk:这是核心运行时包,包含绝大多数单元。编译并安装它。
    • MakerAi.RAG.Drivers.dpk:RAG引擎的数据库驱动包(主要是PostgreSQL支持)。如果你只用SQLite或内存模式,可以不安装此包,但建议编译以备不时之需。
    • MakerAi.UI.dpk:FMX可视化聊天组件包。如果你计划使用TChatList,TChatBubble等UI控件,需要安装它。
    • MakerAiDsg.dpk设计时包。这个包提供了Object Inspector中的属性编辑器(如DriverName下拉列表)、组件图标等。注意:此包依赖VCL和DesignIDE,通常只在Windows的Delphi IDE中安装。在Linux下或纯FPC/Lazarus环境中无需此包。

更简单的方法是直接打开MakerAi\Source\Packages\MakerAiGrp.groupproj组项目文件,IDE会加载所有包,你可以一次性编译整个组。

库路径设置至关重要,否则IDE找不到单元文件。在Delphi中,进入Tools -> Options -> Language -> Delphi Options -> Library,在Library path中添加以下路径(请根据你的实际克隆目录调整):

D:\Dev\Libs\MakerAi\Source\Agents D:\Dev\Libs\MakerAi\Source\Chat D:\Dev\Libs\MakerAi\Source\ChatUI D:\Dev\Libs\MakerAi\Source\Core D:\Dev\Libs\MakerAi\Source\Design D:\Dev\Libs\MakerAi\Source\MCPClient D:\Dev\Libs\MakerAi\Source\MCPServer D:\Dev\Libs\MakerAi\Source\Packages D:\Dev\Libs\MakerAi\Source\RAG D:\Dev\Libs\MakerAi\Source\Resources D:\Dev\Libs\MakerAi\Source\Tools D:\Dev\Libs\MakerAi\Source\Utils

添加后,点击“OK”并重启IDE以确保生效。

4.3 配置API密钥与环境变量

硬编码API密钥是安全实践的大忌。MakerAI推荐使用环境变量。在Windows中,你可以这样设置(以OpenAI为例):

  1. 打开系统属性 -> 高级 -> 环境变量。
  2. 在“用户变量”或“系统变量”中,新建一个变量,名称为OPENAI_API_KEY,值为你的OpenAI API密钥。
  3. 重启你的Delphi IDE,以便它获取新的环境变量。

在代码中,这样引用:

AiConn := TAiChatConnection.Create(Self); AiConn.DriverName := 'OpenAI'; AiConn.Model := 'gpt-4o'; AiConn.ApiKey := '@OPENAI_API_KEY'; // 框架会自动解析@符号并读取环境变量

对于其他提供商,同理设置GEMINI_API_KEYANTHROPIC_API_KEY等环境变量。你也可以直接在属性中填写真实的密钥字符串,但仅限于开发和测试。

4.4 创建第一个聊天应用:两种方式

方式一:使用可视化组件(快速原型)

  1. 新建一个FireMonkey多设备应用程序。
  2. 在工具栏的“MakerAI”页签下,找到TChatListTChatInputTAiChatConnection组件,拖放到窗体上。
  3. 设置TAiChatConnectionDriverNameModelApiKey
  4. TChatInputOnSendMessage事件中,编写如下代码:
procedure TForm1.ChatInput1SendMessage(Sender: TObject; const AMessage: string; AAttachments: TStrings); var Response: string; begin // 将用户消息添加到聊天列表(可选,TChatInput可能已自动处理) ChatList1.AddMessage(AMessage, ctUser); // 使用连接器发送消息并获取流式响应 AiChatConnection1.SendChatMessageAsync( AMessage, procedure (const AContent: string; AIsFinal: Boolean) begin // 流式回调,AContent是陆续到达的文本块 if AIsFinal then ChatList1.AddMessage(AContent, ctAssistant) else ChatList1.UpdateLastMessage(AContent, ctAssistant); // 更新最后一条消息(通常是助理的回复) end, procedure (AError: Exception) begin ShowMessage('Error: ' + AError.Message); end ); end;
  1. 运行程序,你就能得到一个具有流式响应效果的聊天界面。

方式二:使用代码驱动(更灵活控制)如果你不需要UI,或者需要更精细的控制,可以直接使用TAiChatConnection

procedure TForm1.Button1Click(Sender: TObject); var Chat: IAiChat; Msg: TAiChatMessage; Response: TAiChatResponse; begin Chat := AiChatConnection1.CreateChat; // 添加系统指令(可选) Chat.AddMessage(ctSystem, '你是一个有帮助的助手。'); // 添加用户消息 Msg := Chat.AddMessage(ctUser, '你好,请介绍一下你自己。'); // 可以附加文件 Msg.AddFile('path/to/image.png'); // 同步调用(简单,但会阻塞UI) Response := Chat.Execute; Memo1.Lines.Add(Response.Content); // 或者异步调用(推荐,不阻塞UI) Chat.ExecuteAsync( procedure (AResponse: TAiChatResponse) begin TThread.Queue(nil, procedure begin Memo1.Lines.Add(AResponse.Content); end); end, procedure (AError: Exception) begin TThread.Queue(nil, procedure begin ShowMessage('Error: ' + AError.Message); end); end ); end;

5. 进阶实战与避坑指南

5.1 构建一个带RAG的智能问答系统

假设我们要构建一个内部技术文档问答机器人。

  1. 知识库构建:使用TAiVectorRAGConnection连接一个SQLite数据库。编写一个后台服务,遍历所有技术文档(.pdf, .docx, .md),使用TAiRAGDocumentProcessor进行分块、提取文本、生成嵌入向量,并存储到向量数据库中。这个过程可以定期运行以更新知识库。
  2. 查询集成:在聊天逻辑中,当用户提出问题时,先不直接发送给LLM。而是使用VQL从向量数据库中检索最相关的5个文档片段。
    VQL := 'MATCH chunks SEARCH “' + UserQuestion + '” LIMIT 5'; RelevantChunks := VectorRAGConn.Query(VQL);
  3. 构造增强提示:将检索到的片段作为上下文,与用户问题一起构造最终提示。
    ContextText := ''; for Chunk in RelevantChunks do ContextText := ContextText + '--- 参考文档 ---' + sLineBreak + Chunk.Text + sLineBreak; FinalPrompt := '请根据以下提供的上下文信息,回答用户的问题。' + sLineBreak + '如果上下文信息不足以回答问题,请如实告知。' + sLineBreak + sLineBreak + '【上下文】' + sLineBreak + ContextText + sLineBreak + '【用户问题】' + sLineBreak + UserQuestion;
  4. 调用LLM并返回:将FinalPrompt发送给TAiChatConnection,获取答案并返回给用户。

5.2 实现一个带人工审批的自动化流程

利用智能体框架,我们可以设计一个采购申请审批流程。

  1. 定义节点
    • Node1 (LLM):分析采购申请邮件内容,提取物品、数量、预算、申请理由。
    • Node2 (Tool):调用内部系统API,查询申请人的预算余额。
    • Node3 (Conditional):判断逻辑。如果(物品为常规物品 AND 金额 < 阈值 AND 预算充足),则链接到Node4(自动批准);否则,链接到Node5(人工审批)。
    • Node4 (Custom Code):执行自动批准,调用系统接口创建采购单。
    • Node5 (WaitApproval):挂起流程,等待人工审批。触发OnSuspend事件,在UI上显示待审批项。
  2. 配置检查点:为TAIAgentManager设置TAiFileCheckpointer。这样,即使流程在Node5等待审批时服务器重启,重启后也能从Node5恢复状态,而不会丢失已提取的数据。
  3. 人工干预:当UI收到OnSuspend事件时,弹出对话框展示申请详情。用户点击“批准”后,调用AgentManager1.ResumeThread(SuspendedThreadID, 'Node5', '{"decision":"approve"}'),工作流将继续执行Node5之后的节点(可能是发送通知的节点)。

5.3 常见问题与排查技巧

问题1:编译时提示“单元找不到”或“未声明的标识符”。

  • 排查:99%的原因是库路径没有正确设置。请严格按照上文“库路径设置”部分,检查所有路径是否都已添加,并注意路径分隔符和大小写(在Linux上很重要)。确认后,尝试对项目进行“Clean”然后“Build”。

问题2:运行时错误“Driver [OpenAI] not registered”。

  • 排查:确保MakerAI运行时包已正确安装。在项目文件中,检查是否包含了MakerAIrequires部分。对于控制台或简单项目,可能需要手动在.dpr文件的uses部分早期添加MakerAI以初始化驱动注册。

问题3:流式响应不工作,或者UI卡顿。

  • 排查:确保异步调用和UI更新是在正确的线程中进行的。在FireMonkey中,所有对可视化组件的更新都必须在主线程(UI线程)中进行。如上文示例所示,在异步回调中使用TThread.QueueTThread.Synchronize将更新操作派发到主线程。

问题4:RAG检索结果不相关。

  • 排查
    • 嵌入模型:检查使用的嵌入模型是否适合你的文本领域。对于中文,text-embedding-3-small或专门的多语言模型可能比纯英文模型更好。MakerAI允许你通过TAiEmbeddingsConnection配置独立的嵌入模型。
    • 分块大小:分块太大(超过模型上下文窗口)或太小(失去语义)都会影响效果。尝试调整分块大小和重叠区域。
    • 混合搜索权重:调整VQL中WEIGHTS(semantic: X, lexical: Y)的X和Y值。对于专业术语多的文档,可以增加关键词权重(lexical)。
    • 重排序:务必启用RERANK子句。初步检索(召回)追求全面,重排序(精排)追求精准,两者结合效果最佳。

问题5:工具调用时出现EAggregateException

  • 排查:这是v3.3修复的一个Bug,但如果你遇到类似的多任务异常,请检查你的工具执行代码(特别是在OnExecute事件或自定义工具中)是否有未处理的异常。确保所有工具调用都有完善的try...except,并将错误信息通过OnError事件或返回值妥善传递,而不是让异常抛到任务调度层。

问题6:在Free Pascal/Lazarus下某些功能不可用。

  • 排查:首先确认你使用的是fpc分支的代码。其次,FPC版本需>=3.2.0。某些高级特性(如特定平台的语音识别、计算机控制)可能依赖外部库或操作系统特定API,在非Windows平台或FPC上可能受限。请参考fpc分支的README和Demo,它们专门展示了在Lazarus下的可用功能。

我个人在几个企业级项目中深度应用了MakerAI,最大的体会是:它极大地提升了开发效率,将AI集成的复杂度从“基础设施搭建”降级为“业务逻辑组装”。它的架构设计非常“Delphi”,符合Pascal开发者的思维习惯。开始使用时,建议从010-MinimalChat012-ChatAllFunctions这两个Demo入手,先跑通基本流程,再逐步深入研究RAG、智能体等高级模块。遇到问题时,除了查阅GitHub Issues,其活跃的Telegram社区(有英文和西班牙文频道)是获取帮助的绝佳途径。记住,用好TAiCapabilities系统和统一连接器,是写出整洁、可维护AI应用代码的关键。

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

观察高峰时段通过Taotoken调用GPT4模型的路由稳定性

观察高峰时段通过Taotoken调用GPT4模型的路由稳定性 1. 测试环境与观察方法 我们团队在过去三个月的工作日晚间&#xff08;20:00-23:00&#xff09;持续通过Taotoken平台调用GPT4模型完成日常文本生成任务。测试环境采用标准HTTP客户端配置&#xff0c;使用Python的openai库…

作者头像 李华
网站建设 2026/5/4 12:15:27

pynput跨平台开发秘籍:解决Windows、macOS、Linux兼容性问题

pynput跨平台开发秘籍&#xff1a;解决Windows、macOS、Linux兼容性问题 【免费下载链接】pynput Sends virtual input commands 项目地址: https://gitcode.com/gh_mirrors/py/pynput pynput是一个强大的Python库&#xff0c;能够发送虚拟输入命令&#xff0c;轻松实现…

作者头像 李华
网站建设 2026/5/4 12:10:59

如何用LinkSwift实现八大网盘直链下载:3步搞定高速下载难题

如何用LinkSwift实现八大网盘直链下载&#xff1a;3步搞定高速下载难题 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

作者头像 李华
网站建设 2026/5/4 12:07:33

WaveTools鸣潮工具箱:终极游戏性能优化与账号管理完整指南

WaveTools鸣潮工具箱&#xff1a;终极游戏性能优化与账号管理完整指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家设计的全能辅助工具&#xff0c;能够一键…

作者头像 李华