微软生成式AI入门教程:使用函数调用增强AI应用能力
引言
在构建基于大型语言模型(LLM)的应用时,开发者经常面临两个核心挑战:如何获得结构化的响应数据,以及如何让AI模型访问外部数据源。微软生成式AI入门教程中的函数调用(Function Calling)功能正是为解决这些问题而设计的强大工具。
什么是函数调用?
函数调用是Azure OpenAI服务的一项特性,它允许开发者定义可被AI模型调用的函数模板。虽然LLM本身并不真正执行这些函数,但可以通过这种方式获得结构化的响应,开发者再根据这些结构化信息来实际调用对应的函数。
函数调用的核心价值
- 结构化响应:确保每次响应都遵循预定义的格式
- 外部数据集成:突破模型训练数据的限制,实时获取外部信息
- 操作执行:通过自然语言触发实际业务功能
实际问题演示
让我们通过一个教育领域的实际案例来理解函数调用的必要性。
学生信息提取问题
假设我们需要从学生描述文本中提取结构化信息:
student_description = "Emily Johnson是杜克大学计算机科学专业的大二学生,GPA 3.7..."
传统方式下,我们可能这样处理:
prompt = "请从文本中提取以下信息并以JSON格式返回: name, major, school, grades, club"
response = client.chat.completions.create(model=deployment, messages=[{"role": "user", "content": prompt}])
但这种方式存在明显问题:
- 响应格式不一致(如grades可能返回"3.7"或"3.7 GPA")
- 无法保证必填字段
- 难以直接用于下游系统
函数调用解决方案
1. 定义函数结构
首先,我们需要定义一个函数模板:
functions = [
{
"name": "extract_student_info",
"description": "从学生描述文本中提取结构化信息",
"parameters": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "学生全名"},
"major": {"type": "string", "description": "主修专业"},
"school": {"type": "string", "description": "学校名称"},
"gpa": {"type": "number", "description": "GPA分数"},
"clubs": {"type": "array", "items": {"type": "string"}, "description": "参加的社团"}
},
"required": ["name", "major", "school"]
}
}
]
2. 调用AI服务
response = client.chat.completions.create(
model=deployment,
messages=[{"role": "user", "content": student_description}],
functions=functions,
function_call={"name": "extract_student_info"}
)
3. 处理响应
if response.choices[0].message.function_call:
function_name = response.choices[0].message.function_call.name
arguments = json.loads(response.choices[0].message.function_call.arguments)
# 现在我们获得了完全结构化的数据
print(arguments["name"]) # 输出: Emily Johnson
print(arguments["gpa"]) # 输出: 3.7 (保证是数字类型)
实际应用案例:课程推荐系统
让我们构建一个完整的课程推荐流程,展示函数调用的实际价值。
1. 定义课程搜索函数
def search_courses(role: str, product: str, level: str) -> list:
"""实际调用Microsoft Learn API搜索课程"""
params = {"role": role, "product": product, "level": level}
response = requests.get("https://learn.microsoft.com/api/catalog/", params=params)
return [{"title": mod["title"], "url": mod["url"]} for mod in response.json()["modules"][:5]]
2. 配置函数模板
functions = [
{
"name": "search_courses",
"description": "根据条件搜索适合的课程",
"parameters": {
"type": "object",
"properties": {
"role": {"type": "string", "description": "学习者角色(开发者、学生等)"},
"product": {"type": "string", "description": "相关产品(Azure、Power BI等)"},
"level": {"type": "string", "description": "难度等级(初级、中级、高级)"}
},
"required": ["role"]
}
}
]
3. 完整交互流程
# 用户查询
messages = [{"role": "user", "content": "我想找适合初学者的Azure课程"}]
# 第一次调用 - 获取函数调用建议
response = client.chat.completions.create(
model=deployment,
messages=messages,
functions=functions,
function_call="auto"
)
# 执行函数调用
if response.choices[0].message.function_call:
function_name = response.choices[0].message.function_call.name
arguments = json.loads(response.choices[0].message.function_call.arguments)
# 实际调用我们的Python函数
courses = search_courses(**arguments)
# 将结果返回给AI模型
messages.append({
"role": "function",
"name": function_name,
"content": json.dumps(courses)
})
# 第二次调用 - 让AI生成友好响应
final_response = client.chat.completions.create(
model=deployment,
messages=messages
)
print(final_response.choices[0].message.content)
最佳实践建议
- 清晰的函数描述:确保description字段准确描述函数用途
- 合理的参数设计:使用required字段确保关键参数
- 错误处理:为API调用添加适当的错误处理逻辑
- 结果验证:验证AI返回的参数值后再执行函数
- 性能考虑:缓存频繁访问的外部API结果
总结
通过函数调用,开发者可以:
- 获得结构化的响应数据
- 将LLM与外部系统和API集成
- 构建更强大、更可靠的AI应用
微软生成式AI入门教程中的这一功能为开发者提供了将自然语言处理能力与实际业务逻辑连接的桥梁,是构建生产级AI应用的关键技术。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考