Skip to content

스레드형 대화에 주석을 다는 방법

reply_to로 답글 구조를 렌더링하고, 스레드 전체와 개별 댓글에 동시에 주석을 달고, 댓글을 가로질러 스팬을 연결하며, ConvoKit 코퍼스를 양방향으로 주고받는 방법.

포럼 스레드를 하나의 대화록으로 평평하게 만들면, 대화 연구가 가장 관심을 두는 것, 즉 누가 누구에게 답했는지가 사라집니다. 답글 구조를 렌더링하는 일이야말로 스레드를 목록이 아니라 스레드로서 주석 가능하게 만듭니다.

구조를 렌더링한다

yaml
instance_display:
  fields:
    - key: conversation
      type: dialogue
      label: "Thread"
      display_options:
        indent_replies: true

중첩은 각 턴의 reply_to에서 도출됩니다. 턴의 정체성은 turn_id, step_id, 또는 그냥 id에서 읽으므로, 포럼 내보내기, 채팅 로그, 메일링 리스트를 데이터 구조를 바꾸지 않고 다룰 수 있습니다.

안정적인 ID를 쓰십시오. 위치로 물러서면 다시 가져오거나 순서가 바뀐 스레드에서 기존 주석이 모두 다른 대상을 가리키게 됩니다. 누군가 확인하기 전까지는 보이지 않는 종류의 손상입니다.

하나의 필드로 여러 질문을 동시에

쓸모 있는 성질은 하나의 대화 필드가 다음을 동시에 담을 수 있다는 점입니다.

  • 스레드 전체 스키마 — 이 스레드가 궤도를 벗어났는가
  • 댓글별 radio, likert, select, text — 각 댓글을 평가
  • 댓글 내부의 스팬 — 문제가 된 문장을 표시
  • 서로 다른 댓글의 스팬을 잇는 span_link — 어떤 주장과 그것을 반박하는 답글을 연결

마지막 항목이야말로 대화 주석이 실제로 필요로 하는 것이며, 평평한 렌더링으로는 표현할 수 없는 것입니다. 반박이란 서로 다른 두 턴의 두 위치 사이의 관계이기 때문입니다.

분기하는 대화에서는 conversation_tree가 노드 ID로 키를 잡은 노드별 위젯을 갖게 되므로, 분기 트리와 평평한 스레드가 같은 메시지를 가리킬 수 있습니다.

ConvoKit, 양방향으로

ConvoKit(코넬 대학교)은 전산학과 계산언어학에서 대화 연구의 표준 코퍼스 형식입니다.

bash
potato convokit conversations-gone-awry-corpus     # by name
potato convokit ./my-corpus/                       # by directory
potato convokit corpus.zip                         # by zip

대화 단위로도 발화 단위로도 들여올 수 있습니다. --format convokit으로 되돌려 내보낼 때는 기존 코퍼스에 끼워 넣을 수 있는 info.<field>.jsonl 오버레이로도, 전체 덤프로도 출력할 수 있습니다.

알아둘 만한 성질이 둘 있습니다.

  • 각 턴이 실제 발화 ID를 지닙니다. 그래서 댓글별 주석이 위치가 아니라 직접 조회로 왕복합니다.
  • convokit 의존성이 없습니다. 이 형식은 표준 라이브러리만으로 읽고 쓰므로, 코퍼스를 들여오려고 연구용 스택을 끌어오지 않습니다.

실제로 쓰이는 모든 형식 변종을 읽습니다. 이름이 바뀌기 전의 user/root/users.json 배치까지 포함해서입니다.

일치도 측정

스레드 단위 라벨에는 일반적인 범주형 일치도를 씁니다. 흥미로운 쪽은 댓글 단위 라벨인데, 일치도는 스레드 전체로 뭉뚱그리지 말고 댓글별로 계산해야 합니다. 그러지 않으면 쉬운 댓글이 늘어선 긴 스레드가, 정작 문제였던 댓글 하나의 불일치를 덮어버립니다.

댓글 내부의 스팬에는 스팬 일치도를 쓰되, 오프셋은 서버가 적용하는 것과 같은 정규화를 기준으로 계산해야 한다는 점에 유의하십시오. Potato에는 여기에 버그가 있었는데, 서버는 공백을 접고 클라이언트는 접지 않아 대화 안의 모든 오프셋이 어긋났습니다.

더 읽을거리