想利用大模型驱动真实业务系统?基于Semantic Kernel 接入讯飞星火 Function Call 调用本地方法!...
内容提要
本文介绍了利用Semantic Kernel和星火大模型的function call能力调用C#的本地方法的实现方法。通过在消息中带上可调用的函数描述,大模型可以根据上下文分析是否匹配某个函数,并返回函数名和参数值。作者在本地写了一个简单的方法,并通过自定义特性AntSkFunction精确找到该方法。然后通过扫描程序集和读取注释获取方法和参数的描述。在构建Kernel实例时,可以使用CreateFunctionFromMethod方法传入MethodInfo或委托来构建KernelFunction。在构建星火大模型客户端时,可以通过kernel.Plugins.GetFunctionMetadata()方法获取所有配置的sk function,并构建星火sdk的函数参数。最后,通过SkFunction.InvokeAsync方法调用sk的函数,并将结果反馈到UI。作者还提到了递归的处理方式,以及下一步的计划。
延伸解读
Function Call 如何连接大模型与业务系统
文章指出,大模型的 function call 能力是将其应用于企业业务场景的关键。其原理是在发送消息时附带可调用函数的描述,包括函数名、参数、返回值等。大模型根据用户提问和上下文判断是否匹配某个函数,若匹配且参数满足,则返回函数名和参数值;否则会向用户追问缺失的参数。这为开发者提供了一种让大模型主动调用本地方法(如 C# 方法)的机制,从而将模型能力嵌入实际业务逻辑。
实现本地方法调用的关键步骤
作者通过自定义特性 AntSkFunction 标记目标方法,并扫描程序集和读取 XML 注释来获取方法和参数的描述。构建 Kernel 时,使用 CreateFunctionFromMethod 传入 MethodInfo 或委托来创建 KernelFunction。在星火大模型客户端中,通过 kernel.Plugins.GetFunctionMetadata() 获取所有已配置的 SK 函数,并构建星火 SDK 所需的函数参数。模型响应中识别出函数后,解析参数并调用 SkFunction.InvokeAsyn
流式响应下的递归处理机制
由于星火大模型的响应是流式(IAsyncEnumerable)的,在返回 function call 后流会结束,但函数执行结果需要反馈给大模型以生成最终回答。作者采用递归方式:在对话历史中追加函数执行结果,然后重新发起请求,让大模型基于结果组织语言并返回。这个过程意味着一次用户提问可能触发两次大模型调用,第一次用于识别函数,第二次用于整合结果。这种处理方式确保了函数调用结果能自然融入对话。
当前实现范围与后续计划
文章展示的是最基本的实现:用大模型调用 C# 本地方法,并已实现连贯的两次对话效果。作者提到,下一步需要兼容 Semantic Kernel 的其他 SDK(如 OpenAI、Azure)以及 SK 自带的插件。此外,作者计划在方法中调用 UI 元素,在与大模型交流中呈现不同交互,以发挥 Blazor 在大模型应用中的优势。这表明当前方案仍处于原型阶段,扩展性和交互体验是后续重点。
Q&A
如何利用Semantic Kernel调用C#的本地方法?
可以通过在消息中带上可调用的函数描述,使用CreateFunctionFromMethod方法构建KernelFunction,并通过SkFunction.InvokeAsync方法调用本地方法。
大模型的function call能力有什么重要性?
大模型的function call能力是将大模型应用到企业业务场景中的关键,能够使其参与到日常业务中。
在实现过程中如何处理函数参数?
通过扫描程序集和读取xml注释获取方法和参数的描述,并在模型响应中解析参数。
如何在构建星火大模型客户端时获取函数元数据?
可以通过kernel.Plugins.GetFunctionMetadata()方法获取所有配置的sk function,以找到本地方法并构建函数参数。
在调用本地方法时,如何处理递归?
在流式响应中处理递归,以便将函数调用结果反馈给大模型,并在对话历史中记录结果。
未来的计划是什么?
计划兼容其他sdk,如openai和azure,并在UI中呈现与大模型的交互。