Semantic Kernel Python中invoke_async属性不存在,无法调用函数
Semantic Kernel Python:创建并调用函数的正确方法
问题描述
我正在遵循Semantic Kernel官方教程,但无法调用创建的函数,怀疑.NET与Python API差异导致代码编写困难,附上代码及报错信息,寻求创建并调用函数的正确方法。
原代码
from semantic_kernel import Kernel import semantic_kernel from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion from semantic_kernel.functions.kernel_arguments import KernelArguments from semantic_kernel.functions.kernel_function_from_prompt import KernelFunctionFromPrompt import asyncio # Populate values from your OpenAI deployment model_id = "gpt-4" endpoint = "https://xxx.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2025-01-01-preview" api_key = "something here" # Create a kernel and add Azure OpenAI chat completion kernel = Kernel() kernel.add_service( AzureChatCompletion( deployment_name=model_id, endpoint=endpoint, api_key=api_key ) ) async def activities(): print("running activities function") city = "New York" prompt = "I'm visiting {city}. What are some activities I could do ?" activitiesfunction = KernelFunctionFromPrompt("activitiesfunction",prompt=prompt) arguments = {"city": city} result2 = await kernel.invoke_async(activitiesfunction, arguments) print(result2) asyncio.run(activities())
报错信息
result2 = await kernel.invoke_async(activitiesfunction, arguments) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\manuchadha\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\main.py", line 991, in __getattr__ raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') AttributeError: 'Kernel' object has no attribute 'invoke_async'
我尝试在官方文档中查找invoke_async,但未找到相关内容。
问题分析与修正方案
报错核心原因是Semantic Kernel的Python API和.NET API存在差异:Python版本中Kernel对象没有invoke_async方法,异步场景下直接使用kernel.invoke()并await即可。同时还有几处代码细节需要修正:
修正后的代码
from semantic_kernel import Kernel from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion from semantic_kernel.functions.kernel_arguments import KernelArguments from semantic_kernel.functions.kernel_function_from_prompt import KernelFunctionFromPrompt import asyncio # Populate values from your OpenAI deployment model_id = "gpt-4" # 注意:endpoint只需要基础地址,不需要带后续路径和api-version endpoint = "https://xxx.openai.azure.com/" api_key = "something here" # Create a kernel and add Azure OpenAI chat completion kernel = Kernel() kernel.add_service( AzureChatCompletion( deployment_name=model_id, endpoint=endpoint, api_key=api_key ) ) async def activities(): print("running activities function") city = "New York" prompt = "I'm visiting {city}. What are some activities I could do?" # 修正KernelFunctionFromPrompt的初始化方式,用name参数指定函数名 activities_function = KernelFunctionFromPrompt(name="activitiesfunction", prompt=prompt) # 使用KernelArguments传递参数,而非普通字典 arguments = KernelArguments(city=city) # 替换invoke_async为invoke result = await kernel.invoke(activities_function, arguments) print(result) asyncio.run(activities())
关键修改点说明
- 替换异步调用方法:将
kernel.invoke_async改为kernel.invoke,Python版本的invoke本身就是异步方法,直接await即可 - 修正函数构造方式:
KernelFunctionFromPrompt需要用name参数指定函数名,而非位置参数 - 规范参数传递:使用
KernelArguments类传递参数,这是Semantic Kernel Python推荐的参数传递方式 - 修正endpoint格式:AzureChatCompletion的endpoint只需填写基础域名,SDK会自动拼接请求路径和api-version,避免手动填写导致的错误
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

