示例:从会议记录中提取行动项¶
在本指南中,我们将逐步介绍如何使用 OpenAI API 从会议记录中提取行动项。此用例对于自动化项目管理任务至关重要,例如任务分配和优先级设置。
动机
大量时间用于会议,行动项作为这些讨论的可执行成果产生。自动化行动项的提取可以节省时间,并确保不会遗漏任何关键任务。
定义结构¶
我们将会议记录建模为 Ticket
对象的集合,每个对象代表一个行动项。每个 Ticket
可以包含多个 Subtask
对象,代表主任务中更小、更易管理的组成部分。
import Instructor from "@/instructor"
import OpenAI from "openai"
import { z } from "zod"
const PrioritySchema = z.enum(["HIGH", "MEDIUM", "LOW"]);
const SubtaskSchema = z.object({
id: z.number(),
name: z.string(),
})
const TicketSchema = z.object({
id: z.number(),
name: z.string(),
description: z.string(),
priority: PrioritySchema,
assignees: z.array(z.string()),
subtasks: z.array(SubtaskSchema).optional(),
dependencies: z.array(z.number()).optional()
})
const ActionItemsSchema = z.object({
items: z.array(TicketSchema)
})
type ActionItems = z.infer<typeof ActionItemsSchema>
提取行动项¶
要从会议记录中提取行动项,我们使用 extractActionItems
函数。它调用 OpenAI API,处理文本,并返回一组建模为 ActionItems
的行动项。
const oai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY ?? undefined,
organization: process.env.OPENAI_ORG_ID ?? undefined
})
const client = Instructor({
client: oai,
mode: "FUNCTIONS",
})
const extractActionItems = async (data: string): Promise<ActionItems | undefined> => {
const actionItems: ActionItems = await client.chat.completions.create({
messages: [
{
"role": "system",
"content": "The following is a transcript of a meeting...",
},
{
"role": "user",
"content": `Create the action items for the following transcript: ${data}`,
},
],
model: "gpt-4o",
response_model: { schema: ActionItemsSchema },
max_tokens: 1000,
temperature: 0.0,
max_retries: 2,
})
return actionItems || undefined
}
评估和测试¶
为了测试 extractActionItems
函数,我们为其提供了一份示例记录,然后打印出提取的行动项的 JSON 表示形式。
const actionItems = await extractActionItems(
`Alice: Hey team, we have several critical tasks we need to tackle for the upcoming release. First, we need to work on improving the authentication system. It's a top priority.
Bob: Got it, Alice. I can take the lead on the authentication improvements. Are there any specific areas you want me to focus on?
Alice: Good question, Bob. We need both a front-end revamp and back-end optimization. So basically, two sub-tasks.
Carol: I can help with the front-end part of the authentication system.
Bob: Great, Carol. I'll handle the back-end optimization then.
Alice: Perfect. Now, after the authentication system is improved, we have to integrate it with our new billing system. That's a medium priority task.
Carol: Is the new billing system already in place?
Alice: No, it's actually another task. So it's a dependency for the integration task. Bob, can you also handle the billing system?
Bob: Sure, but I'll need to complete the back-end optimization of the authentication system first, so it's dependent on that.
Alice: Understood. Lastly, we also need to update our user documentation to reflect all these changes. It's a low-priority task but still important.
Carol: I can take that on once the front-end changes for the authentication system are done. So, it would be dependent on that.
Alice: Sounds like a plan. Let's get these tasks modeled out and get started.`
)
console.log({ actionItems: JSON.stringify(actionItems) })
可视化任务¶
为了快速可视化数据,我们使用了代码解释器创建了 ActionItems 数组 JSON 版本的 Graphviz 导出文件。
{
"items": [
{
"id": 1,
"name": "Improve Authentication System",
"description": "Revamp the front-end and optimize the back-end of the authentication system",
"priority": "High",
"assignees": ["Bob", "Carol"],
"subtasks": [
{
"id": 2,
"name": "Front-end Revamp"
},
{
"id": 3,
"name": "Back-end Optimization"
}
],
"dependencies": []
},
{
"id": 4,
"name": "Integrate Authentication System with Billing System",
"description": "Integrate the improved authentication system with the new billing system",
"priority": "Medium",
"assignees": ["Bob"],
"subtasks": [],
"dependencies": [1]
},
{
"id": 5,
"name": "Update User Documentation",
"description": "Update the user documentation to reflect the changes in the authentication system",
"priority": "Low",
"assignees": ["Carol"],
"subtasks": [],
"dependencies": [2]
}
]
}
在此示例中,extractActionItems
函数成功识别并分割了行动项,并根据会议中的讨论为其分配了优先级、负责人、子任务和依赖项。
通过自动化此过程,您可以确保重要任务和详细信息不会淹没在会议记录的海洋中,从而使项目管理更加高效和有效。