使用 Delphi 写 AI 大模型的 Agent
简单的概念解释
所谓的 Agent 是运行在本地电脑上的一个程序。这个程序可以让大模型来调用,在本地电脑上执行一些代码,然后把代码执行结果给大模型,并且大模型还能够理解代码的执行结果。
如何实现的思考
AI 大模型的输入和输出都是字符串。在聊天方式下,人脑当然可以阅读理解 AI 输出的内容。如果我们使用 Delphi 来写程序,如何知道 AI 想要调用哪个函数?如何让 Delphi 程序去执行这个函数?
Delphi 内置的 WebService 框架
WebService 的底层是 SOAP 调用,而 SOAP 调用的底层通讯是 XML 字符串!
尝试
首先,用 Delphi 创建一个 WebService 服务器端程序用于测试。
构造一个 WebService 服务器端程序
我使用 Delphi 创建了一个 WebService 服务器端程序,它输出给客户端调用的接口定义代码:
type TMyArrayInt = Array Of Integer; { Invokable interfaces must derive from IInvokable }
IIMyTest = interface(IInvokable) ['{10981E31-3C5C-4611-BB68-5964025D690F}'] { Methods of Invokable interface must not use the default } { calling convention; stdcall is recommended }
function Hello(const S: string): string; stdcall;
procedure HelloWord(const S: string; var MyResult: string); stdcall;
function TestArray(A: TIntegerSOAPArray ): TIntegerSOAPArray ; stdcall;
function XPlusY(const X, Y: Integer): Integer; stdcall;
end;
这里,我们聚焦到 function XPlusY(const X, Y: Integer): Integer; stdcall; 上,它的实现代码是:
function TIMyTest.XPlusY(const X, Y: Integer): Integer;
begin
Result := X + Y;
end;
WebService 验证客户端
同样,使用 Delphi 创建一个标准的 WebService 客户端程序,去调用服务器的 XPlusY 函数,代码如下:
procedure TFmMain.Button3Click(Sender: TObject);
var Intf: IIMyTest; X, Y, Z: Integer;
begin
Intf := HTTPRIO1 as IIMyTest;
X := 10;
Y := 33;
Z := Intf.XPlusY(X, Y);
ShowMessage(Z.ToString);
end;
运行服务器端程序和客户端程序,客户端程序上的 Button3 点击后,确实收到服务器端的返回,弹出消息框显示43,成功。
获得 Delphi 的 WebService 客户端程序向服务器发起函数调用的通讯内容
因为客户端是使用 HTTPRIO1 这个控件去调用服务器端,因此,我们在 HTTPRIO1.OnBeforeExecute 事件里面写代码拦截,代码如下:
procedure TFmMain.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var S: TStringStream; SS: string;
begin
S := TStringStream.Create;
try
SoapRequest.Position := 0;
S.CopyFrom(SoapRequest);
S.Position := 0;
SS := S.ReadString(S.Size);
Log(SS);
finally
S.Free;
end;
end;
上述代码中,Log 方法的代码如下:
procedure TFmMain.Log(const S: string);
begin
TThread.Synchronize(nil, procedure begin Memo1.Lines.Add(S); end );
end;

