Kernel、插件与模型服务
Kernel 组织能力,函数负责业务
Kernel 保存服务、插件和调用管道;plugin 将相关函数命名组织起来;function 是可调用单元。原生函数运行确定代码,prompt function 调用模型,两者可以通过同一调用接口组织,但可靠性与副作用不同。
Python 3.12 建立独立环境并锁定实际依赖。这里固定 Semantic Kernel 1.36.0,与后续章节一致;升级时在独立环境重跑本书实验。不要把 .NET 的方法名与 Python 导入混写。
bash
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install 'semantic-kernel==1.36.0'
python -m pip freeze > requirements.lock保存 native.py,运行 python native.py,不需要密钥或模型:
python
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.functions import kernel_function,KernelArguments
class Inventory:
@kernel_function(name='lookup',description='查询图书库存;未知返回 -1')
def lookup(self,sku: str) -> int:
return {'A':3,'B':0}.get(sku,-1)
async def main():
kernel=Kernel()
plugin=kernel.add_plugin(Inventory(),plugin_name='inventory')
result=await kernel.invoke(plugin['lookup'],arguments=KernelArguments(sku='B'))
assert result.value==0
print('stock',result.value)
asyncio.run(main())decorator 提供名称和描述,add_plugin 注册命名空间,invoke 经 Kernel 调用管道执行函数。这里没有模型决定,所以应稳定输出 0。-1 是此小例子的未知约定,正式接口更适合用 found/count 对象,避免负数与业务值混淆。
添加一个真实模型服务
设置 OPENAI_API_KEY、OPENAI_MODEL 后保存 prompt.py,这部分会调用模型,本次未运行计费请求:
python
import asyncio,os
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import KernelArguments
async def main():
kernel=Kernel()
kernel.add_service(OpenAIChatCompletion(service_id='chat',
ai_model_id=os.environ['OPENAI_MODEL'],api_key=os.environ['OPENAI_API_KEY']))
result=await kernel.invoke_prompt('用一句话解释 {{$term}}',
arguments=KernelArguments(term='幂等性'))
print(str(result))
asyncio.run(main()) 是模板变量,不是 Python f-string;变量替换只拼接输入,不自动把用户内容变可信。多个服务时用 service_id 与 execution settings 明确路由,不能依赖注册顺序碰巧选中某个模型。Azure 部署名、endpoint 与 API version 是另一种服务配置,不把 OpenAI 模型名直接当 Azure deployment。
参阅 Kernel Python 与 原生插件。
练习
在 native.py 同一 Kernel 中调用 A、B、X,断言 3、0、-1。解释为什么这个测试不需要配置模型。
先记录自己的输出与解释,再核对本章答案。