LLM에게 문서를 쓰게 할 때, 대화를 나누면서 문서를 작성해 나가는 방식은 흔히 사용된다. 하지만 의도한 결과물을 쓰게 하는 것은 생각만큼 쉽지 않다. 어려움 중 하나는 대화의 문맥과 결과물의 문맥이 같은 곳에 섞여 버린다는 점에 있다. 지금 문서의 내용을 결정하고 있는 것이 대화의 흐름인지, 아니면 확정된 정보인지가 모호해진다.
문서는 입력의 파생물이다
그래서 Document Model이라는 것을 생각했다. 대화 속에서 문서 자체를 만들어 나가는 것을 그만두고, LLM에게는 구조화된 입력을 제공하며, 문서는 거기서부터 생성하게 한다. 입력은 산문이 아니다. 필드(Field)의 집합이다.
{
"language": "ja",
"documentType": "기술 기사 (Zenn)",
...
글을 쓰는 것은 여전히 LLM이다. 바뀌는 것은 인간 쪽이며, 손을 대는 대상이 문서에서 입력으로 옮겨간다. 문서는 편집 대상이 아니라, 입력으로부터 얻어지는 파생물이 된다.
Document = DocumentModel(Input)
입력이 출력을 결정한다.
LLM을 두 가지 역할로 나누어 사용하기
핵심은 LLM을 두 가지 역할로 나누어 사용하는 데 있다. 한쪽은 대화 상대가 되는 LLM으로, 인간의 말을 듣고 인식의 차이를 메워가며 입력을 구성한다. 이 LLM은 문서를 쓰지 않는다. 다른 한쪽은 렌더러(Renderer)로, 입력만을 받아서 문서를 쓴다. 이 LLM은 대화를 보지 않는다.
렌더러가 받는 것은 입력뿐만이 아니다. 문서의 작성 방식을 정한 규칙도 함께 전달한다. 무엇을 어떤 순서로 쓸지, 어떤 톤으로 할지, 무엇을 써서는 안 되는지가 그곳에 적혀 있다. 역할마다 문맥을 분리해 버리면 서로 섞일 일이 없다.
문법은 맞지만, AI가 썼다는 것을 알 수 있다
구조적으로 혼선은 사라졌지만, 기사로 완성하는 단계에서는 다른 곳에서 애를 먹었다. LLM의 문장은 유창하고, 문법도 정확하며, 의미도 통한다. 그럼에도 독자가 AI의 문장임을 알아채는 이유는, 의미는 통하지만 실제로는 사용되지 않는 말투가 섞여 있기 때문이다.
더 까다로운 것은 독자가 내용을 따라가지 못하게 만드는 작성 방식이다. 렌더러는 입력을 전부 알고 있다. 독자는 그때까지 쓰인 내용만을 알고 있다. 이 차이가 렌더러에게는 보이지 않는다. 그래서 아직 설명하지 않은 것을 가리키며 쓰거나, 아직 제시하지 않은 대비를 전제로 삼기도 한다. 쓰는 입장에서는 논리가 맞다고 보이지만, 읽는 입장에서는 이야기가 끊겨 있다.
증상이 나타날 때마다 규칙에 규정을 추가하면 고쳐진다. 대신 규정은 늘어나고 서로 간섭하게 된다. 출력을 다른 LLM에게 리뷰하게 하는 루프(Loop)도 돌려보았지만, 리뷰가 보는 것은 결락(누락)뿐이다. 무엇이 부족한지는 말해주지만, 무엇이 필요 없는지는 말해주지 않는다. 루프는 더하는 방향으로만 움직인다.
조금 더 시행착오를 거쳐 볼 생각이다.
Discussion