跳到内容

示例:从会议记录中提取行动项

在本指南中,我们将逐步介绍如何使用 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 导出文件。

action items

{
  "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 函数成功识别并分割了行动项,并根据会议中的讨论为其分配了优先级、负责人、子任务和依赖项。

通过自动化此过程,您可以确保重要任务和详细信息不会淹没在会议记录的海洋中,从而使项目管理更加高效和有效。