AWS 기술 블로그

생성형 AI로 혁신하는 법률 서비스: Amazon Bedrock으로 구현한 법무법인대륜의 서면 작성 AI 시스템

주식회사 대륜은 대륜법무그룹의 일원으로, ‘고객이 가장 쉽고 편리하게 찾을 수 있는 로펌이자 가장 명쾌한 솔루션을 제시하는 세계적인 로펌’을 목표로 단기간에 법무법인 대륜을 국내 10대 대형 로펌으로 성장시킨 기업입니다. 대륜은 각 분야 전문 변호사들과 함께 고객의 상황에 맞는 최고의 법률 서비스를 제공하고 있으며, 어렵고 낯설게 느껴질 수 있는 법률 서비스를 더욱 편리하게 이용할 수 있도록 리걸테크 (Legaltech) 솔루션을 제공하는 데에도 집중하여 현재까지 판례 검색 기능이나 변호사 추천 기능 등을 개발해왔습니다.

대륜 서면 작성 AI는 고소장·항소장·답변서 등과 같이 전문적 법률지식을 요구하는 여러 종류의 법률서류를 생성형 AI를 이용해 손쉽게 작성하도록 도와주는 솔루션입니다. 법 관련 지식이 많지 않은 일반 사용자 입장에서는, 법적 소송을 준비할 때 본인의 상황에 대한 법리적인 해석을 작성하고 특정 법률서류의 형식에 맞게 문서를 완성하는 과정이 어렵게 느껴질 수 있습니다. 서면 작성 AI는 사용자가 본인의 사건에 대한 전반적인 내용을 입력으로 넣으면, Amazon Bedrock을 통해 생성형 AI가 사건에 대한 법리적 해석을 작성하고 관련 판례를 함께 제공함으로써, 법률 전문가가 아니더라도 누구나 손쉽게 복잡한 법률 서류를 편리하게 작성할 수 있도록 합니다. 아래 그림은 서면 작성 AI 챗봇의 UI로, 서면 파일 생성관련 판례 검색 두 가지 기능의 구현 결과를 보여주고 있습니다.

이 블로그에서는 서면 작성 AI가 어떻게 고객의 법률 경험을 개선하는지, Amazon BedrockAWS Step Functions와 같은 AWS 서비스를 활용해 이 솔루션을 구현한 이유와 그 상세한 구현 과정을 공유합니다.

서면 작성 AI를 개발하게 된 이유

법률 서면이란, 소송이나 재판 과정에서 진술하고자 하는 사항을 기재하여 법원에 제출하는 문서를 말합니다. 서면의 종류로는 고소장부터 항소장, 답변서와 같이 전문적인 법 지식을 요구하는 문서가 많기에 일반인의 입장에서는 작성하기가 어렵게 느껴질 수 있습니다. 이에 법률 서비스를 이용하고자 하는 고객은 문서 하나를 작성하기 위해 찾아봐야 할 정보가 너무 많고, 이 때문에 전문 변호사에게 서면 작성을 의뢰하는 경우도 많지만 이 경우에도 하나의 서류를 완성하는 데에 적지 않은 비용과 시간을 지불하게 됩니다. 변호사들 역시 다량의 서면 작성 의뢰가 이어지면 업무가 과중되어 신속한 법률 서비스의 제공이 힘들어지게 될 수 있습니다.

이러한 상황에 도움이 되기 위해, 대륜 개발팀은 생성형 AI를 이용해 법률 서면의 초안을 자동으로 작성해주는 솔루션을 개발하게 되었습니다. 사용자는 서면 작성 AI 챗봇 화면에 접속해 본인의 사건에 대한 기본적인 설명을 입력하고 원하는 서류 양식을 선택하기만 하면, 생성형 AI가 서류 양식에 맞추어 청구 취지, 청구 원인과 같은 법리적 내용을 작성해 서면의 초안을 완성합니다. 사용자는 AI가 작성한 초안을 다운로드하여 직접 내용을 추가하거나, 추가 정보를 채팅에 제공하고 서류의 보완을 요청할 수 있습니다.

또한 고객들이 과거에 있었던 비슷한 사건에 대한 판결 결과를 자주 질문한다는 점에서 착안하여, 고객의 사건 내용을 분석한 뒤 RAG (Retrieval-Augmented Generation) 기술을 이용해 대륜이 보유하고 있는 대량의 법률 데이터 중 고객의 사례와 유사한 과거 판례를 검색하고 채팅으로 함께 제공할 수 있도록 했습니다. 이로써, 해당 솔루션은 일반인 사용자들에게는 법률 서비스에 대한 접근성과 이해도를 높이고 관련 서류를 보다 손쉽게 완성하도록 돕는 것은 물론, 법조계 종사자들 역시 업무 효율성을 증진시킬 수 있도록 돕는 것을 목표로 합니다.

*유튜브 재생이 안 되실 경우 다음 링크에서 확인해주세요: https://youtu.be/aiHjiOJVSU0

 솔루션 개요

대륜 서면 작성 AI는 Amazon Bedrock을 기반으로, Anthropic Claude 3.5 Sonnet v2 모델을 사용하여 구현되었으며, 아래 그림과 같이 총 3개의 주요한 흐름으로 구성되어 있습니다.

Figure 1. 솔루션 개요

사용자가 채팅으로 사건 내용을 입력하면, (1) Claude 3.5 Sonnet v2를 통해 사용자의 요청 내용을 먼저 파악하고 요청이 ‘서면 작성’이 맞는 경우에만 이후 워크플로를 실행합니다. 그 외의 요청인 경우에는 이후 작업을 실행하지 않고 워크플로를 실행하지 않음으로써 불필요한 AI 사용을 방지하도록 합니다.

서면 작성 요청이 맞는 경우 (2-1) 서면의 초안을 작성하는 워크플로와, (2-2) 유사한 판례를 검색해 함께 제공하는 워크플로를 병렬로 동시에 실행하게 됩니다. (2-1)로 표시된 서면 작성 워크플로에서는 여러 서면 문서 형식 중 작성해야 할 문서의 양식을 읽어온 후, Claude 3.5 Sonnet v2가 사용자가 입력한 사건 내용을 해당 문서에 알맞는 형태로 재구성하고 법리적 해석을 작성합니다. 이 내용을 .docx 파일에 작성하여 곧바로 다운 받아 사용할 수 있는 서면 초안 문서로 제공(3-1) 할 수 있도록 합니다.

(2-2)로 표시된 유사 판례 검색 워크플로에서는 RAG를 구현하기 위해 Bedrock Knowledge bases를 활용하여 대륜 팀이 보유하고 있는 대량의 과거 판례 데이터베이스에서 유사한 판례를 검색합니다. 이후 검색된 각 판례의 내용을 간결하게 요약하는 작업을 거친 뒤, 관련 판례의 목록을 채팅으로 제공(3-2) 하여 고객이 서면과 함께 참고 자료로 활용할 수 있도록 합니다. 유사 판례 검색 워크플로에서는 여러 판례를 검색하고 요약하는 반복적인 과정을 단순하게 정의하고 실행하기 위해 Bedrock Flows 기능을 활용했습니다. (자세한 내용은 이후 워크플로 및 구현 상세에서 이어집니다.)

솔루션 아키텍처

서면 작성 AI가 어떤 아키텍처로 구현되었는지 자세히 알아볼까요? 아래는 서면 작성 AI의 아키텍처 다이어그램으로, 위에서 설명한 (1) 사용자 의도 분석, (2-1) 서면 파일 작성, (2-2) 관련 판례 제공의 흐름이 어떤 서비스로 구현되었는지를 나타냅니다.

Figure 2. 서면 작성 AI 솔루션 아키텍처Figure 2. 서면 작성 AI 솔루션 아키텍처

사용자가 채팅 애플리케이션을 통해 사건 내용을 입력하고 원하는 서류 형식을 선택해 요청을 제출하면, 요청한 내용은 AWS Lambda로 전달됩니다. 해당 Lambda 함수가 AWS Step Functions 워크플로를 실행시키면, 워크플로 내부에서 (1) 사용자 의도 분석을 위해 Amazon Bedrock을 이용해 사용자가 요청한 내용이 무엇인지 파악한 뒤, Step Functions의 Choice state를 이용해 ‘서면 작성 요청’인 경우에만 다음 단계를 실행 시키도록 흐름을 제어합니다 (구현 상세 1 참고). 서면 작성 요청인 경우, (2-1) 사건 내용을 바탕으로 법적 형식에 맞는 서면 초안을 작성하는 로직과, (2-2) 유사한 판례를 검색해 서면과 함께 제공하는 RAG 로직을 Step Functions의 Parallel state를 이용해 병렬로 실행하여, 사용자가 서면 초안과 관련 판례를 함께 채팅으로 받아볼 수 있도록 구성하였습니다. 자세한 내용은 아래 [워크플로 및 구현 상세] 섹션에서 설명 드리겠습니다.

워크플로 및 구현 상세

아래는 Step Functions로 구현한 서면 작성 AI의 핵심 로직 워크플로입니다. 사용자 의도 분석 (구현 상세 1)을 진행한 후, 서면 파일 작성 (구현 상세 2-1), 그리고 관련 판례 제공 (구현 상세 2-2)의 단계를 병렬로 실행합니다. 각 단계 별 자세한 구현 내용은 아래에 이어집니다.

Figure 3. 서면 작성 AI의 Step Functions 워크플로

구현 상세 1: 사용자 의도 분석 및 서면 작성 요청 필터링

대륜 서면 작성 AI는 채팅을 이용해 사용자로부터 사건 내용을 입력 받고 이를 AI로 분석한 뒤 서면 작성을 위한 여러 추가적인 과정을 거치는 등 다수의 단계로 구성된 워크플로이기 때문에 많은 경우의 수를 고려해야 했습니다. 채팅으로 들어온 사용자의 요청이 ‘서면 작성’이 아니라 단순 질문이거나 법률과 관계 없는 요청일 경우에는 서면 작성을 위한 다음 단계를 실행할 필요가 없었기 때문에, 가장 먼저 Amazon Bedrock을 이용해 관련 요청이 맞는지 사용자의 의도를 확인하는 과정을 거쳤습니다.

Step Functions 워크플로 내에서 Bedrock InvokeModel API를 통해 Claude 3.5 Sonnet v2을 호출하여 사용자 요청의 의도를 파악합니다. 사용자의 의도가 ‘서면 작성’이 아닌 경우에는, Step Functions의 Choice state를 이용해 다음 단계를 실행하지 않고 워크플로를 종료하도록 분기 처리를 해주었습니다. 만약 서면 작성 요청이 맞는 경우에는, 사용자가 입력한 내용으로부터 법률적인 요구사항을 분류합니다.

예를 들어, “온라인 게임에서 현금 거래 중 사기를 당한 사건에 대한 고소장을 작성해달라”고 요청하면, 아래와 같은 [프롬프트]와 함께 요청이 Claude 3.5 Sonnet v2에 전달되어, [결과물]과 같이 사용자의 의도 (action와 요청 내용 요약 (summary)이 도출됩니다.

[프롬프트]

당신은 전문적인 법률 보조가입니다. 당신의 역할은 사용자 요청의 의도를 파악한 뒤, 
아래의 <Guide>를 참고하여 ‘action’과 ‘summary’라는 두 개의 속성을 가진 구조화된 JSON 객체로 정리하는 것입니다. 
<ExampleOutput>을 참고해 JSON Object 형식으로 답하세요. 
<ExampleOutput>의 JSON 형식만 참고하고 내용을 그대로 다시 작성하지 마세요. 
답변에는 JSON 객체 외에 다른 설명을 포함하지 마세요.

<Guide>
1. 사용자가 “민사 사건에 대한 고소장을 작성하길 원한다”면, 'action' 키의 값은`1`, 'summary' 키의 값은 '사용자의 입력을 법률적으로 해석하고 정리한 내용'을 입력하세요.
2. 사용자가 “지금 대화중인 내용을 어떤 형태로 정리하기를 원한다”면, 'action' 키의 값은`2`, 'summary' 키의 값은 '사용자의 요청에 맞게markdown 문서로 정리한 내용'을 입력하세요.
3. 사용자가 “단순한 법적 질문 또는 조언을 요구한 것”이라면, 'action' 키의 값은`3`, 'summary' 키의 값은 '사용자의 질문 또는 조언에 대한 적절한 답'을 입력하세요.
4. 그 이외의 경우, 'action'키의 값은 `0`, 'summary' 키의 값은 `죄송합니다. 저는 법률적인 질문에만 답변하는AI입니다.`라고 답하세요.
</Guide>
<ExampleOutput>
{
"action": 0, 
"summary": "죄송합니다. 저는 법률적인 질문에만 답변하는AI입니다."
}
</ExampleOutput>
Bash

[결과물]

Input 예시:

내가 온라인 게임에서 현금 거래를 하는데, 상대방이 내 돈을 받고 아이템을 보내주지 않았어. 이 사건에 대해 고소장을 작성해줘.

Output 예시:

{
"action": 1,
"summary": "온라인 게임 내 현금거래 사기 사건에 대한 법률적 해석:
1. 사건 개요: 온라인 게임 아이템 거래 과정에서 현금만 지급하고 아이템을 받지 못한 사기 피해
2. 적용 법조: 형법 제347조(사기죄)
3. 구성요건:
  - 기망행위: 아이템 거래를 미끼로 현금을 받아냄
  - 피해금: 지급한 현금
  - 고의성: 아이템을 전달할 의사 없이 현금만 수령
4. 입증자료 필요사항:
  - 거래 내역 캡처본
  - 대화 내용 기록
  - 입금 증빙자료
*참고: 본 사건은 형사사건으로 소장이 아닌 고소장 작성이 필요함"
}
HTML

 위 Output의 `action` 값을 기준으로 Step Functions의 Choice state를 설정해, 값이 1인 경우 (고소장을 작성하길 원하는 경우) 에만 서면 작성 워크플로를 실행하도록 설정, 그 외의 경우에는 다음 단계를 실행하지 않도록 구성했습니다. 이와 같이 분기 처리를 진행한 것은 시간 및 비용 절감 측면에서 도움이 되었습니다.

또한 위와 같이 AI 응답을 출력할 때 종종 Json 객체 앞뒤로 불필요한 내용을 덧붙이거나, 표준에 맞지 않은 문자열이 들어가 파싱이 안 되는 경우가 있었는데 이를 해결하고자 Lambda 함수 (JsonSummaryPostProcessing)를 추가하여, json에서 벗어난 문자를 제거하고 표준 문자로 치환하는 과정을 거쳤습니다.

 구현 상세 2-1: 서면 파일 작성

사용자가 제공한 사건 정보를 바탕으로 법률 서면 초안을 작성합니다. 이 초안은 법적 형식을 갖추고 있어 법적 효력이 있을 수 있도록 구성됩니다.

서면은 그 종류가 굉장히 다양하기 때문에 각각의 서면의 종류에 따라 작성해야 할 정보가 다릅니다. 예를 들어 ‘고소장’에는 사용자와 상대방의 인적 사항과 고소 이유에 대해서만 작성하면 되지만, ‘답변서’에는 사용자와 상대방의 인적 사항과 상대방의 고소 이유, 그에 대한 사용자의 답변이 작성되어야 하고 문서 양식도 달라집니다. 이에 대륜 팀은 문서 별로 .docx 형식의 비어있는 서면 템플릿 파일과, 해당 템플릿에 맞게 서면을 작성하도록 미리 작성된 System prompt를 S3 버킷에 저장해두고, 사용자가 선택한 문서 형식에 따라 해당 정보를 함께 불러오도록 구성했습니다. 이렇게 S3에서 불러온 프롬프트를 Claude 3.5 Sonnet v2에 전달하여, 사용자가 입력한 사건 개요를 바탕으로 해당 문서에 필요한 내용을 작성합니다.

 

[프롬프트]

당신은 똑똑한 법률 전문가이다. 
당신은 <의뢰인>의 사건 내용을 듣고 대한민국 법원에 제출할 소장을 작성하는 역할이다.
소장에 필요한 내용은 "원고(plaintiff)", "피고(defendant)", "청구취지(purportOfClaim)", "청구원인(causeOfAction)", "입증방법(meansOfProof)"이다.
<의뢰인>의 내용을 최대한 신뢰하여 <LawsuitExample>를 참고하여 소장의 내용을 작성하라. <LawsuitExample>는 예시일 뿐이므로 똑같이 작성하면 안 된다.
"원고(plaintiff)", "피고(defendant)"에 대한 정보가 불충분한 것은 예시와 동일하게 작성하라.
<의뢰인>의 내용은 JSON Object 형태로 제공되며 'latest_prompt'가 현재 요구하는 사항이며, 'chatting'은 당신과 의뢰인이 나눈 대화를 입력시간 순서대로 오름차순으로 기록한 것이다. 
여기서 의뢰인은 'user'이며, 당신은 'assistant'이다.
응답의 첫 글자는 '{'이어야 하며, 마지막은 '}'이어야 한다.

<LawsuitExample>
{
"plaintiff": [
{"name":"홍길동","personal_number": "00000000-0000000","address": "서울특별시 영등포구 여의대로 24, 21층(여의도동, 에프케이아이타워)", "tel": "010-0000-0000" } 
], 
"defendant": [ 
{ "name": "홍길순", "personal_number": "00000000-0000000", "address": "서울특별시 영등포구 여의대로 24, 21층(여의도동, 에프케이아이타워)", "tel": "010-0000-0000" }, 
{ "name": "홍길아", "personal_number": "00000000-0000000", "address": "서울특별시 영등포구 여의대로 24, 21층(여의도동, 에프케이아이타워)", "tel": "010-0000-0000" }, 
], 
"purportOfClaim": [ 
"1. 피고는 원고에게 1,000,000 원 및 이에 대하여 소장부본 송달 다음 날부터 다 갚는 날까지 연 12%의 비율로 계산한 돈을 지급하라.", 
"2. 소송비용은 피고가 부담한다.", 
"3. 제1항은 가집행할 수 있다." 
], 
"causeOfAction": [ 
"1. 피고가 원고를 폭행하였음.", 
"2. 폭행으로 전치 2주의 상해를 입음", 
"3. 원고는 정신적, 물질적 피해를 입음" 
], 
"meansOfProof": [ 
"1. 피고가 원고를 폭행하는 영상", 
"2. 멍든 사진", 
"3. 병원비 영수증" 
] 
}
</LawsuitExample>
Bash

[결과물]

{"plaintiff": [{
 "name": "홍길동",
 "personal_number": "00000000-0000000",
 "address": "서울특별시 영등포구 여의대로24, 21층(여의도동, 에프케이아이타워)",
 "tel": "010-0000-0000"
 }],
"defendant": [
 {
 "name": "이름불상",
"personal_number": "00000000-0000000",
"address": "주소불명",
"tel": "연락처불명"
 }
 ],
"purportOfClaim": [
 "1. 피고는 원고에게 게임 아이템 대금 상당의 금액 및 이에 대하여 소장부본 송달 다음 날부터 다 갚는 날까지 연12%의 비율로 계산한 돈을 지급하라.",
"2. 소송비용은 피고가 부담한다.",
"3. 제1항은 가집행할 수 있다."
 ],
"causeOfAction": [
 "1. 원고는 피고와 온라인 게임 내 아이템 거래를 하기로 합의함",
"2. 원고는 합의된 금액을 피고에게 송금하였음",
"3. 피고는 대금을 수령한 후 약속한 게임 아이템을 전달하지 않음",
"4. 이는 사기죄에 해당하는 행위임"
 ],
"meansOfProof": [
 "1. 게임 내 채팅 내역 캡처본",
"2. 계좌이체 증명서",
"3. 거래 당시의 게임 로그 기록",
"4. 피고와의 연락 내역 캡처본"
 ]
}
Bash

위와 같이 AI가 서면에 작성할 내용을 생성한 이후에는, 해당 값들을 .docx 형식의 서면 파일에 붙여넣는 Lambda 함수를 실행합니다. 그 결과, 아래와 같은 서면 초안 파일이 완성됩니다.

Figure 4. 서면 작성 AI를 통해 작성된 결과물 (작성 전/ 작성 후)

구현 상세 2-2: 관련 판례 검색 및 제공 (RAG)

사용자가 입력한 사건과 유사한 판례를 검색하고 그 결과를 요약해 제공하기 위해 RAG를 구현했습니다. 이는 사용자가 유사한 법적 문제에서 참고할 수 있는 정보를 쉽게 얻을 수 있도록 합니다.

RAG 구축을 위해 먼저 대륜 팀은 11만여 건의 과거 판례 파일을 Amazon S3 버킷에 저장하고, Bedrock Knowledge bases를 이용해 검색 가능한 형태의 지식 베이스를 생성했습니다. 이때 RAG의 검색 성능을 높이기 위해서, S3에 파일을 저장하기 전 하나의 파일에는 하나의 판례에 대한 내용만 들어가도록 하고, 모든 파일의 내용이 같은 형식을 가지도록 전처리하는 작업을 거쳤습니다. S3에 데이터를 구성한 후에는 Knowledge base에서 제공하는 ‘Default Chunking’ 전략을 활용하여 문서를 적절한 Chunk로 나누고, Amazon Titan Embedding V2 모델을 이용해 문서를 임베딩하는 작업을 거쳐 RAG를 구성했습니다. 이렇게 구축한 RAG에서 특정 판례를 검색 (Retrieve) 해올 때는 Bedrock Knowledge bases가 기본 제공하는 Hybrid Search 옵션을 선택해 벡터 유사도를 활용한 Semantic 검색과 키워드 기반의 Lexical 검색이 둘 다 활용될 수 있도록 함으로써 검색의 정확도를 높였습니다. Bedrock Knowledge base는 이렇게 Chunking 방식부터 Embedding 모델, 그리고 Search 방식 선택에 있어 다양한 옵션을 제공해주었기 때문에 RAG를 손쉬우면서도 높은 정확도로 구성하도록 도와주었습니다.

데이터를 검색해온 후에는, 해당 데이터를 요약 및 처리하는 과정이 반복적으로 수행되어야 하기 때문에, 대륜 팀은 AI 워크플로의 쉬운 흐름 제어 및 다른 서비스와의 간편한 통합을 위해 Bedrock Flows를 활용했습니다. Bedrock Flows는 Amazon Bedrock에서 생성형 AI 애플리케이션의 설계 및 실행을 손쉽게 돕기 위한 기능으로, 아래와 같은 GUI를 이용해 시각적으로 워크플로를 정의하고 흐름을 관찰하는 데 도움이 됩니다. Bedrock Flows의 자세한 활용 방법은 문서를 참고해주세요.

Figure 5. Bedrock Flows의 flow builder UI

대륜 팀은 Bedrock Flows를 이용하여 관련 판례를 검색하고 처리하는 RAGFlow (Figure 6) 와 관련 판례 정보를 간결하게 요약하는 SummarizationFlow (Figure 7)의 2가지 워크플로로 정의했습니다. RAGFlow에서는 관련 판례를 검색하고 각각의 판례에 대해 이미 작성된 요약이 있는지 판단하여, 이전에 요약해둔 값이 S3에 있다면 해당 내용을 불러오고, 없다면 SummarizationFlow를 호출해 새로운 요약을 생성합니다. 이와 같이 여러 단계로 구성된 워크플로를 Bedrock Flows의 Condition 노드와 Iterator 노드를 이용해 손쉽게 구현할 수 있었습니다.

먼저, Step Functions 워크플로 (Figure 3) 내에서 InvokeBedrockFlows Lambda 함수가 유사 판례 검색을 위해 아래의 RAGFlow에 Input으로 사건 개요를 전달하며 Flow가 시작됩니다. RAGFlow는 총 4개의 단계를 거치며 판례를 검색하고 각 판례에 대해 요약과 같은 후처리를 진행합니다.

Figure 6. RAGFlow

  • 단계 1. Flow input으로 String 형태의 사건 개요 (document)가 입력되면, Bedrock Knowledge base 노드 (FindCaseLaw)에서 사건 내용과 비슷한 판례를 검색하고, 유사 판례 데이터 결과를 Array 형태로 다음 단계에 반환합니다.
    •  
  • 단계 2. Iterator 노드 (IteratorFiles)를 이용해 배열 내의 각 판례 데이터 객체에 접근한 뒤,
  • 단계 3. Condition 노드 (IsSummaryExist)를 이용해 각 판례 데이터에 대해 “이전에 작성된 요약이 있는지” 확인합니다. (기존 요약이 있다면 4-2, 없다면 4-1로 이어집니다.)
  • 단계 4-1. 만약 이전에 요약한 값이 없고 새로 검색된 판례인 경우, CreateSummaryOrBypass Lambda 함수가 SummarizationFlow (Figure 7 참고) 를 호출하여 판례 요약을 새로 작성합니다. Summary가 작성되면 다른 판례 요약과 JSON Object로 합치는 작업을 진행 (CombineData) 후, 관련 판례 데이터를 리턴 (ReturnSummary_1)하며 Flow가 종료됩니다.
    •  
  • 단계 4-2. 만약 이전에 요약한 값이 있다면, S3에서 해당 요약 내용을 불러온 뒤 (LoadSummary), 다른 판례 데이터와 합치는 작업을 진행 (CombineData) 후 관련 판례 데이터를 리턴 (ReturnSummary_2)하며 Flow가 종료됩니다.

아래는 RAGFlow 내에서 각 판례 요약 및 후처리를 위해 호출하는 SummarizationFlow 입니다. SummarizationFlow 내에서는 Prompts 노드 (GenerateCaseLawSummary) 를 거치며 Claude 3.5 Sonnet v2가 새로 요약을 생성하고, 추후 동일 판례 검색 시 요약된 텍스트만 가져오기 위해 이를 S3에 저장 (SaveCaseLawSummary) 하는 과정을 거칩니다.

Figure 7: SummarizationFlow

이와 같이, 검색된 판례 여러 건에 대하여 상태를 파악하고 서로 다른 단계를 각각 반복적으로 수행하는 데에 Bedrock Flows는 많은 도움이 되었습니다. 위 과정이 모두 끝나면 아래와 같이 관련 판례의 판결 번호와 요약, 출처가 배열로 반환됩니다.

[결과물]

{
  "case_law": [
    {
      "case_num": "서울고등법원 2011나36512",
      "case_summary": "국회의원이 언론인의 성매매 관련 발언을 한 것에 대해 조선일보가 사설로 비판하자 명예훼손 등으로 손해배상을 청구한 사건으로, 법원은 일부 모욕적 표현에 대해 1천만원 배상 인정",
      "case_path": "HTML_서울고등법원 2012 1 27 선고 2011나36512 판결.txt"
    },
    {
      "case_num": "서울고등법원 2015. 12. 16. 선고 2015나2026878 판결",
      "case_summary": "노동조합이 조합원 총회 의결 없이 사측과 근로조건 변경 노사합의를 체결한 것이 조합원들의 절차적 권리를 침해한 불법행위에 해당하여 손해배상책임이 인정된 사건",
      "case_path": "HTML_서울고등법원 2015 12 16 선고 2015나2026878 판결.txt"
    },
    {
      "case_num": "2008가단96240",
      "case_summary": "현직 국회의원이 방송사의 뇌물 관련 보도로 명예가 훼손되었다며 손해배상을 청구했으나, 법원은 공직자에 대한 언론의 감시기능을 고려해 원고 청구를 기각함",
      "case_path": "2008간단96240[1].txt"
    },
    {
      "case_num": "2019다29778 외 10건",
      "case_summary": "2019다29778(미사용 연차수당 지급 관련 포괄임금 약정 효력), 2019다203286(자기앞수표 이득상환청구권 체납처분), 2019다224238(집합투자재산 운용 관련 선관주의의무 위반), 2023다229827(청구이의), 2023다249555(토지 소유권이전등기), 2023다259743(임대차보증금), 2023다263346(가등기말소), 2020도10180(저작권법위반), 2019두53952(차별시정재심판정취소), 2020두41696(법인지방소득세), 2020두37857(법인세) 등 판결",
      "case_path": "1704699552310_163912.txt"
    }
  ]
}
Bash

그 결과, 아래와 같이 채팅 창에서 관련 유사 판례를 검색한 결과를 서면과 함께 제공할 수 있게 되었습니다.

Figure 8. 대륜 서면 작성 AI 챗봇 화면

솔루션 도입 효과 및 향후 계획

이 서비스를 통해 법적 문서의 초안 작성 시간을 크게 단축시켰고, 사용자와 비슷한 법적 사례를 쉽게 검색하여 관련 정보를 제공할 수 있게 되었습니다. 결과적으로 사용자들은 법적 조치를 준비하는 과정에서 더 높은 신뢰성과 효율성을 경험할 수 있게 되었습니다.

향후에는 더 다양한 서면 종류를 추가하여 솔루션의 활용 범위를 확대할 계획입니다. 또한, 사용자 피드백을 반영하여 AI의 정확성과 응답의 자연스러움을 지속적으로 개선해 나갈 예정입니다.

현 시점에서는 우선 사내 변호사들을 대상으로 오픈할 예정이며, 애플리케이션을 더욱 개선하여 사용자 범위를 일반인 유저들로 확대할 계획입니다.

 

대륜 팀이 AWS 기술을 선택한 이유

Amazon Bedrock을 선택한 이유

1. 다양한 최신 모델을 테스트 및 선택하기 쉬운 환경 제공

대륜 서면 작성 AI는 Amazon Bedrock을 적극 활용하여 개발되었습니다. Bedrock은 다양한 AI 기업의 최신 파운데이션 모델을 API를 통해 쉽게 활용할 수 있는 완전관리형 서비스입니다. 대륜 팀은 Amazon Bedrock이 최신 고성능 모델을 안정적으로 제공하고, 다양한 모델을 단순히 API 파라미터 변경 만으로 사용할 수 있는 유연성을 제공하여 지속적으로 새로운 모델을 활용하고 테스트해볼 수 있다는 점에서 최적의 선택이라고 판단하여 선택하게 되었습니다.

대륜 팀은 Amazon Bedrock에서 제공하는 다양한 모델을 테스트한 끝에 Claude 3.5 Sonnet v2모델을 선택하게 되었으며, 해당 모델은 동일 계열 모델 대비 비용 효율적이면서도 서면 초안 작성과 같은 고급 언어 작업에서 탁월한 품질을 보였습니다. 현재 해당 모델은 뛰어난 성능과 효율성을 통해 대륜 AI 솔루션의 핵심 역할을 하고 있습니다.

2. Amazon Bedrock Flows

Bedrock Flows 역시 대륜 팀이 AWS에서 생성형 AI 애플리케이션 개발을 시작한 결정적인 요인 중 하나였습니다. Bedrock Flows는 생성형 AI 워크플로를 시각적으로 설계하고 프롬프트를 기반으로 다양한 AWS 서비스와 손쉽게 통합하는 데에 도움이 되었으며, RAG 등의 생성형 AI 관련 로직으르 빠르게 개발하고 실험하고자 했던 대륜 팀에 특히 유용한 기능이었습니다.

Bedrock Flows를 선택한 가장 큰 이유 중 하나는, 코드를 짜지 않고도 Flows가 제공하는 Iterator 노드, Condition 노드와 같은 기능을 조합해서 복잡한 로직을 시각적으로 구성할 수 있었기 때문입니다. 그 예시로 (구현 상세 2-2)의 판례 검색 기능을 개발할 때, RAG를 통해 여러 개의 판례 목록을 검색해 온 후, 리스트 내의 각각의 판례에 대해 기존에 요약된 값이 S3에 있는지 확인, 만약 값이 있으면 S3로, 값이 없다면 새로운 요약을 Bedrock이 작성하도록 하는 등의 복잡한 로직의 구현이 필요했는데, 이 경우 Iterator 노드를 이용해 리스트에 각 값에 편하게 접근할 수 있었고 Condition 노드를 이용해 각 데이터에 대한 조건 검사를 쉽게 구성할 수 있었습니다. 이러한 흐름을 코드로 짜야 했다면 흐름을 정의하는 것부터 여러 분기 처리 및 테스트까지 여러 고려사항이 있었겠지만, Bedrock Flows가 제공하는 Flow builder UI를 이용해 손쉽게 흐름을 정의하고 테스트할 수 있었습니다.

또한 Bedrock Flows의 Prompt Management 노드 역시 Bedrock을 활용하는 데 큰 도움이 된 기능입니다. Prompt Management는 프롬프트 작성과 변수 지정, 버전 관리 및 비교를 한 번에 수행할 수 있는 기능으로, 작성한 프롬프트의 특정 버전을 사용하고 변수 목록을 자동으로 UI에 표시해주어 프롬프트의 관리와 테스트를 매우 편리하게 만들었습니다. 대륜 팀은 Prompt Management 의 변형 비교를 이용해 작성한 프롬프트에 대해 다양한 조건과 다양한 모델을 바꾸어 테스트했을 때 응답이 어떻게 달라지는지 시각적으로 확인했고, 이를 통해 여러가지 조건과 모델을 대상으로 테스트하고 개선점을 찾을 수 있었습니다. 아래와 같이, 동일 모델에 대해 서로 다른 프롬프트를 입력했을 때, 각각 어떤 응답 값이 나오는지 한눈에 비교하고 더 적합한 프롬프트를 찾을 수 있었습니다.

 Figure 9. Bedrock Prompt Management UI

3. Amazon Bedrock Knowledge bases

AI가 작성한 서면 초안과 함께 사용자들이 법률 관련 데이터를 손쉽게 찾아보고 참고하도록 돕기 위해 대륜 팀은 RAG를 이용한 유사 판례 검색 기능을 함께 개발하였습니다. 이를 위해 Bedrock에서 제공하는 관리형 RAG 기능인 Knowledge bases를 활용하였는데, 이는 대륜 팀이 보유한 11만여 건의 방대한 판례 데이터에서도 높은 수준의 검색 성능을 보이며 Claude 3.5 Sonnet v2와 같은 최신 모델과도 손쉽게 통합할 수 있었기 때문에 대륜 팀이 단기간 내에 RAG를 구축하는 데 있어 가장 적합한 선택이었습니다.

Amazon Bedrock Knowledge bases를 사용함으로써 서면 초안 작성 뿐만 아니라, 초안과 관련된 판례 정보를 추가로 제공함으로써 더 신뢰할 수 있는 AI 솔루션을 구현할 수 있었습니다. 해당 솔루션을 통해 단순히 언어 모델이 생성한 텍스트를 제공하는 것에 그치지 않고, 정확한 법적 근거와 관련된 판례를 신뢰성 있게 연결하여 사용자에게 더욱 유용한 정보를 제공할 수 있다는 점에서 큰 강점이 되고 있습니다.

이렇게 Amazon Bedrock이 제공하는 다양한 기능을 활용함으로써 개발 시간을 크게 단축할 수 있었고, 이는 대륜 팀이 AI 서면 작성과 RAG를 통한 판례 제공의 두 가지 핵심 기능을 한정된 시간 안에 균형 있게 발전시키는 데 중요한 역할을 했습니다.

AWS Step Functions를 선택한 이유

대륜 팀에서 AWS Step Functions를 도입하게 된 가장 큰 이유는, 서면 작성 AI의 복잡한 흐름을 명확하게 설계하고 검증하기 위해서 였습니다. 대륜 팀은 새로운 서비스를 설계할 때 추상적인 아이디어를 구체적인 흐름으로 정리하는 데 어려움을 겪곤 했는데, Step Functions를 도입하면서 이러한 설계 과정을 크게 개선할 수 있었습니다. Step Functions를 통해 각 단계를 블럭 형태로 연결하고 시각적으로 확인할 수 있었기 때문에, 초기 설계에서부터 구현까지의 유연성과 설계 검증이 훨씬 수월 해졌습니다. 특히, 설계 단계에서 시간이 오래 걸리는 작업이나 병렬 처리가 필요한 경우가 많았는데, 이때 Step Functions의 ‘Parallel’ state를 활용해 이러한 작업들을 동시에 처리할 수 있었습니다. 또한 조건에 따라 다른 로직을 실행해야 하는 경우에는 ‘Choice’ state를 이용해 간단히 분기 처리를 진행했습니다. 이런 식으로 복잡한 흐름을 간단하고 직관적으로 설계할 수 있었고, 각 단계 간의 Input과 Output을 테스트하면서 설계를 더욱 안정적으로 만들 수 있었습니다.

또한 기존에는 프로세스 중 오류가 발생했을 때, CloudWatch에 접속해 로그를 추적하는 방식으로 문제를 해결해야 했는데, 이는 시간이 많이 소모되고 번거로운 작업이었습니다. Step Functions를 도입하면서 아래와 같은 UI를 통해 상태머신의 진행 상황을 시각적으로 확인할 수 있었고, 에러가 발생한 위치도 명확히 추적할 수 있게 되면서, 문제 해결 과정이 훨씬 더 간단 해졌습니다. 이 부분이 대륜 팀이 AWS Step Functions를 선택하게 된 결정적인 이유 중 하나입니다.

Figure 10. Step Functions가 제공하는 console 

이와 같이, 대부분의 애플리케이션 로직은 Step Functions로 작성하고, AI 관련 로직은 Bedrock Flows를 활용하여 구조를 명확히 분리할 수 있었습니다.

마무리

지금까지 Amazon Bedrock의 다양한 기능과 Claude 3.5 Sonnet v2모델을 통해 사용자의 요건을 자세하게 파악해 법률 서면 파일을 작성해주고, 사용자가 참고할 수 있는 관련 판례 데이터도 함께 검색해볼 수 있는 대륜의 서면 작성 AI의 구현 과정을 소개해드렸습니다.

주식회사 대륜은 생성형 AI와 같은 기술을 적극 활용하여 법률 전문가가 아니더라도 누구나 손쉽게 법률 서비스에 접근할 수 있는 환경을 만들기 위해 다양한 시도를 하고 있습니다. 해당 솔루션이 법률 서비스를 이용하는 고객들의 경험을 혁신하길 기대합니다.

해당 솔루션을 만드는 데 사용된 AWS 서비스들의 더 자세한 사용법 및 사용 사례가 궁금하신 분들은 아래의 자료를 참고해보세요.

 

동태완

동태완

동태완 매니저는 주식회사 대륜 개발팀에서 Engineer로 근무하며 AI 모델 및 서비스 개발(LLM, LMM, RAG)을 담당하고 있으며, 회사의 AI 기술 발전과 서비스를 안정적으로 운영하고 배포하기 위해 필요한 개발을 담당하고 있습니다.

김규형

김규형

김규형 매니저는 주식회사 대륜 개발팀에서 Engineer로 근무하며 AI 모델 및 서비스 개발(LLM, LMM, RAG)을 담당하고 있으며, 회사의 AI 기술 발전과 서비스를 안정적으로 운영하고 배포하기 위해 필요한 개발을 담당하고 있습니다.

엄유진

Eu Jin Eom

엄유진 Cloud Sales Rep. 은 기업이 클라우드 활용해 제품/서비스 혁신에 집중할 수 있도록 최적의 AWS 서비스와 아키텍처를 제안하고 고객의 디지털트랜스포메이션 여정을 함께합니다.

Yoonseo Kim

Yoonseo Kim

김윤서 솔루션즈 아키텍트는 고객들의 비즈니스 문제를 AWS의 기술을 통해 해결하고 구현하는 데 도움을 드리고 있습니다.