跳到内容

从会议记录中提取行动项

在本指南中,我们将逐步介绍如何使用 OpenAI API 和 Pydantic 从会议记录中提取行动项。此用例对于自动化项目管理任务(例如任务分配和优先级设置)至关重要。

对于多标签分类,我们引入了一个新的枚举类和不同的 Pydantic 模型来处理多个标签。

动机

大量时间用于会议,而行动项正是这些讨论的可执行结果。自动化行动项提取可以节省时间,并确保不会遗漏任何关键任务。

定义结构

我们将会议记录建模为一组 Ticket 对象,每个对象代表一个行动项。每个 Ticket 可以包含多个 Subtask 对象,代表主要任务中较小、易于管理的组成部分。

提取行动项

为了从会议记录中提取行动项,我们使用 generate 函数。它调用 OpenAI API,处理文本,并返回一组建模为 ActionItems 的行动项。

评估和测试

为了测试 generate 函数,我们为其提供一份示例记录,然后打印提取出的行动项的 JSON 表示。

import instructor
from openai import OpenAI
from typing import Iterable, List, Optional
from enum import Enum
from pydantic import BaseModel


class PriorityEnum(str, Enum):
    high = "High"
    medium = "Medium"
    low = "Low"


class Subtask(BaseModel):
    """Correctly resolved subtask from the given transcript"""

    id: int
    name: str


class Ticket(BaseModel):
    """Correctly resolved ticket from the given transcript"""

    id: int
    name: str
    description: str
    priority: PriorityEnum
    assignees: List[str]
    subtasks: Optional[List[Subtask]]
    dependencies: Optional[List[int]]


# Apply the patch to the OpenAI client
# enables response_model keyword
client = instructor.from_openai(OpenAI())


def generate(data: str) -> Iterable[Ticket]:
    return client.chat.completions.create(
        model="gpt-4",
        response_model=Iterable[Ticket],
        messages=[
            {
                "role": "system",
                "content": "The following is a transcript of a meeting...",
            },
            {
                "role": "user",
                "content": f"Create the action items for the following transcript: {data}",
            },
        ],
    )


prediction = generate(
    """
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."""
)

可视化任务

为了快速可视化数据,我们使用代码解释器创建了 ActionItems 数组的 JSON 版本的 graphviz 导出。

action 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]
  }
]

在本示例中,generate 函数成功识别并分割了行动项,并根据会议中的讨论为其分配了优先级、负责人、子任务和依赖关系。

通过自动化此过程,可以确保重要的任务和细节不会丢失在会议记录的汪洋大海中,从而使项目管理更加高效和有效。