使用 Delphi 构建 AI Agent 调用 WebService
基本概念解释
所谓的 Agent 是运行在本地电脑上的一个程序。该程序可被大模型调用,在本地执行代码并将结果反馈给大模型,同时大模型能够理解这些执行结果。
实现思路
AI 大模型的输入和输出均为字符串。在聊天模式下,人脑可以阅读理解 AI 输出的内容。若使用 Delphi 编写程序,如何识别 AI 想要调用的函数?如何让 Delphi 程序执行该函数?
Delphi 内置的 WebService 框架
WebService 的底层基于 SOAP 调用,而 SOAP 调用的底层通讯依赖 XML 字符串。
测试验证
首先,使用 Delphi 创建一个 WebService 服务器端程序用于测试。
构造 WebService 服务器端程序
我使用 Delphi 创建了一个 WebService 服务器端程序,其输出给客户端调用的接口定义代码如下:
type TMyArrayInt = Array Of Integer;
IIMyTest = interface(IInvokable)
['{10981E31-3C5C-4611-BB68-5964025D690F}']
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,成功。
获取 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 方法将请求内容写入 Memo1 以便查看。再次执行对服务器端 XPlusY 函数的调用,HTTPRIO1 发送的内容如下:
<?xml version="1.0"?>
<SOAP-ENV:Envelope = = = =>1033

