RAG #02. 실전: 세법 RAG를 위한 pgvector 임베딩¶
지난 RAG #01. RAG 밑바닥부터 웹 채팅까지 튜토리얼에서는 RAG에 대한 이해도를 높이기 위해 Vector Store를 파이썬 리스트로 직접 구현했었습니다. 이번 튜토리얼부터 실전 튜토리얼로서, 실제 서비스 개발에 많이 사용되어지는 Postgres pgvector 확장을 장고 프로젝트에 통합하는 방법을 다뤄보겠습니다.
pgvector
를 선택한 이유는 다음과 같습니다.
Postgres를 사용하는 서비스에서는 추가 인프라 없이 벡터 검색 기능을 구현할 수 있습니다.
장고가 지원하는 수많은 데이터베이스 중에 Postgres는 장고가 가장 잘 지원하는 오픈소스 데이터베이스입니다.
단일 데이터베이스로 관계형 데이터와 벡터 데이터를 함께 관리할 수 있어 운영이 단순해집니다. 물론 벡터 데이터를 별도의 데이터베이스로 나눠 관리할 수도 있습니다. 장고 모델의 라우터 기능을 활용하면, 모델 별로 다른 데이터베이스 혹은 다른 데이터베이스 엔진을 바라보도록 손쉽게 설정할 수 있습니다.
pgvector
파이썬 라이브러리에서 장고 ORM을 직접 지원하기에, 통합이 쉽습니다.
본 튜토리얼을 통해, 장고 모델을 활용하여 Postgres 데이터베이스에 데이터를 저장하고 자동으로 임베딩 벡터까지 생성하여 저장하는 방법을 배우게 됩니다.
# 문서 데이터만 지정하면, 임베딩까지 자동으로 OK
PaikdabangMenuDocument.objects.create(
page_content="1. 아이스티샷추가(아.샷.추)\n - SNS에서 더 유명한 꿀팁 조합 음료 :) 상콤달콤한 복숭아맛 아이스티에 진한 에스프레소 샷이 어우러져 환상조합\n - 가격: 3800원",
metadata={"source": "./chat/assets/빽다방.txt"},
)
쿼리셋을 통해 손쉽게 코사인 거리 검색을 사용할 수 있습니다. 물론 L2 거리 검색도 가능합니다.
본 튜토리얼에서 search
메서드를 재사용성 높은 방식으로 직접 구현해봅니다.
# 일반적인 장고 쿼리셋 사용법과 동일한 방식으로 유사도 검색 지원
doc_list: List[PaikdabangMenuDocument] = \
await PaikdabangMenuDocument.objects.search("빽다방 고카페인 음료 종류는?")
search
메서드는 쿼리셋 메서드이기에, 장고 쿼리셋으로 검색 대상의 범위를 좁힌 뒤에
유사 문서 검색을 수행할 수 있습니다.
qs = PaikdabangMenuDocument.objects.filter(...) # 조회 조건 지정
doc_list = await qs.search("빽다방 고카페인 음료 종류는?")
문서 리스트를 프롬프트 문자열에 손쉽게 전달할 수 있습니다.
# 랭체인 Document 리스트와 동일한 포맷으로 변환됩니다.
지식 = str(doc_list)
새로운 문서 모델이 필요할 때, 본 튜토리얼을 통해 직접 구현한 Document 모델 상속 만으로 손쉽게 새로운 문서 모델을 추가할 수 있게 됩니다.
# 상속 만으로 임베딩부터 유사도 검색까지 OK. (인덱스 지정은 필요합니다.)
class StarbucksMenuDocument(Document):
pass
# 세법 해석례 문서 모델
class TaxLawDocument(Document):
pass
TaxLawDocument
모델을 통해 세법 해석례 문서를 저장하고, 아래와 같이 간결한 코드로
질문과 유사한 문서를 검색할 수 있습니다.
question = "재화 수출하는 경우 영세율 첨부 서류로 수출실적명세서가 없는 경우 해결 방법"
doc_list = await TaxLawDocument.objects.search(question)
for idx, doc in enumerate(doc_list, 1):
print(f"문서 #{idx} : 코사인 거리 {doc.distance:.3f}")
print(doc)
print()
실행 결과
SELECT "chat_taxlawdocument"."id",
"chat_taxlawdocument"."page_content",
"chat_taxlawdocument"."metadata",
"chat_taxlawdocument"."created_at",
"chat_taxlawdocument"."updated_at",
"chat_taxlawdocument"."embedding", ("chat_taxlawdocument"."embedding" <=> '[0.012661192566156387,
0.00366991083137691,
-0.006133993621915579,
-- 생략
문서 #1 : 코사인 거리 0.425
Document(metadata={‘url’: ‘https://taxlaw.nts.go.kr/qt/USEQTA002P.do?ntstDcmId=010000000000035248’}, page_content=’{“문서ID”: “010000000000035248”, “제목”: “직수출 재화의 영세율 첨부서류”, “문서번호”: “서삼46015-12043”, “법령분류”: “부가가치세”, “요지”: “수출하는 재화의 영세율 첨부서류는 수출실적명세서로 하는 것이나 외화획득내역을 입증할 수 있는 증빙서류로 갈음할 수 있음”, “회신”: “부가가치세법 제11조 제1항 제1호 및 동법 시행령 제24조 제1항 제1호의 규정에 의한 부가가치세 영세율이 적용되는 수출하는 재화에 있어서 부가가치세 예정신고 또는 확정신고시에 제출하여야 하는 영세율 첨부서류는 동법 시행령 제64조 제3항 제1호의 규정에 의한 재정경제부령이 정하는 수출실적명세서(전자계산조직에 의하여 처리된 테이프 또는 디스켓을 포함하며, 소포우편에 의하여 수출한 경우에는 당해 우체국장이 발행하는 소포수령증)로 하는 것이나, 부득이한 사유로 인하여 당해 서류를 첨부할 수 없는 때에는 국세청장이 정하는 서류로써 갈음할 수 있는 것이며, 법령 또는 훈령에 정한 서류를 제출할 수 없는 경우에는 영세율 규정에 의한 외화획득명세서에 당해 외화획득내역을 입증할 수 있는 증빙서류를 첨부하여 제출하는 것입니다.”, “파일내용”: “1. 질의내용 요약 당사는 직수출시 수출실적명세서에 수출대금입금증명서를 첨부하고 내국신용장이니 구매확인서에 의하는 경우 관련 사본을 첨부하여 부가세 신고를 하여왔던 바, 타업체에 의하면 2002년 7월부터는 직수출의 경우에는 수출실적명세서만을 첨부하여 신고가능하다고 하는 바, 이의 타당여부? 2. 질의내용에 대한 자료 가. 관련 조세법령(법률,시행령,시행규칙) ○ 부가가치세법 제11조 【영세율 적용】 ① 다음 각호의 재화 또는 용역의 공급에 대하여는 영의 세율을 적용한다. 1. 수출하는 재화 ○ 부가가치세법 시행령 제24조 【수출의 범위】 ① 법 제11조 제1항 제1호의 규정에 의한 수출은 다음 각호의 것으로 한다.(2001. 12. 31 개정) 1. 내국물품(우리나라 선박에 의하여 채포된 수산물을 포함한다)을 외국으로 반출하는 것 2. 국내의 사업장에서 계약과 대가수령 등 거래가 이루어지는 것으로서 다음 각목의 1에 해당하는 것 (2001. 12. 31 개정) 가. 대외무역법에 …”, “공개여부”: “공개”, “문서분류”: “질의”, “생성일시”: “2003-12-31 00:00:00”, “수정일시”: “2023-12-08 16:12:13”}’)
문서 #2 : 코사인 거리 0.433
Document(metadata={‘url’: ‘https://taxlaw.nts.go.kr/qt/USEQTA002P.do?ntstDcmId=010000000000009322’}, page_content=’{“문서ID”: “010000000000009322”, “제목”: “국제기구에 납품하는 재화의 영세율 첨부서류”, “문서번호”: “부가1265.1-1676”, “법령분류”: “부가가치세”, “요지”: “국제기구 납품재화의 영세율 첨부서류는 수출대금입금증명서 또는 당해 외국정부기관 등이 발급한 납품사실을 증명할 수 있는 서류임”, “회신”: “영세율 첨부서류는 부가가치세법시행령 제64조 제3항 제6호에 규정한 수출대금입금증명서 또는 당해 외국정부기관 등이 발급한 납품사실을 증명할 수 있는 서류이나, 당해 서류를 부득이한 사유로 인하여 제출할 수 없는 경우에는 외화입금증명서 또는 외환매입증명서나 외국환매각증명서를 첨부한다. (영 제64조 제3항 제6호, ’82. 12. 31 개정)”, “파일내용”: “”, “공개여부”: “공개”, “문서분류”: “질의”, “생성일시”: “1982-06-24 00:00:00”, “수정일시”: “2023-12-08 16:12:13”}’)
문서 #3 : 코사인 거리 0.509
Document(metadata={‘url’: ‘https://taxlaw.nts.go.kr/qt/USEQTA002P.do?ntstDcmId=010000000000008161’}, page_content=’{“문서ID”: “010000000000008161”, “제목”: “영세율 첨부서류의 미제출시 영세율 적용 여부”, “문서번호”: “간세1235-2578”, “법령분류”: “부가가치세”, “요지”: “영세율 적용대상 과세표준에 대한 신고 시 신고불이행, 신고누락, 첨부서류의 미제출에 관계없이 사실상 적용대상임이 확인되는 경우 영세율이 적용됨”, “회신”: “사업자가 영세율 적용대상 과세표준에 대하여 예정신고 또는 확정신고 시 신고불이행, 신고누락, 첨부서류의 미제출에 관계없이 사실상 영세율 적용대상임이 확인되는 경우에 한하여 영세율이 적용된다.”, “파일내용”: “”, “공개여부”: “공개”, “문서분류”: “질의”, “생성일시”: “1978-09-08 00:00:00”, “수정일시”: “2023-12-08 16:12:13”}’)
문서 #4 : 코사인 거리 0.524
Document(metadata={‘url’: ‘https://taxlaw.nts.go.kr/qt/USEQTA002P.do?ntstDcmId=010000000000099002’}, page_content=’{“문서ID”: “010000000000099002”, “제목”: “수정세금계산서를 교부하여야 하는지 여부”, “문서번호”: “부가22601-1789”, “법령분류”: “부가가치세”, “요지”: “수출품생산업자가 수출신용장을 수출업자에게 양도하고 수출대행계약을 체결하여 재화를 수출하는 경우 세금계산서 교부의무가 면제되는 것이나, 수출품생산업자가 이를 착오로 세금계산서를 교부한 경우 수정세금계산서를 교부하여야 하는 것임”, “회신”: “1. 귀 질의1의 경우 수출품생산업자가 수출신용장을 수출업자에게 양도하고 수출대행계약을 체결하여 재화를 수출하는 경우에는 당해 수출품생산업자가 수출업자로부터 완제품내국신용장을 개설받았다하더라도 세금계산서 교부의무가 면제되는 것이나, 수출품생산업자가 이를 착오하여 세금계산서를 교부한 경우에는 부가가치세법 시행령 제59조의 규정에 의하여 수정세금계산서를 교부하여야 하는 것이며 2. 귀 질의2의 경우는 별첨 소득세 기본통칙 3-1-4…28을 참고.”, “파일내용”: “1. 질의내용 요약 ○ 수출업자(A)로써 대행 수출시 수출품생산업자(B)에게 수출대행계약서와 함께 완제품 내국신용장을 개설하여 주었습니다. 부가세법 16조 (통칙5-2-12)에는 이러한 경우에도 세금계산서 교부가 면제된다고 되어 있는데 실질적인 거래에서는 B가 A앞으로 세금계산서를 발행하여야 은행에서 NEGO가 되며 결재됩니다. 이럴때 세금계산서 처리 문제를 A입장에서 질의함. 가. 부가세 신고시 발행된 매입세금계산서 나. 소득세에서의 수입금액에의 포함여부. 2. 관련 조세 법령 (법률, 시행령, 시행규칙, 기본통칙) ○ 부가가치세법 시행령 제59조 ○ 소득세법 기본통칙 3-1-4…28 【수출대행의 경우 총수입금액】”, “공개여부”: “공개”, “문서분류”: “질의”, “생성일시”: “1987-08-31 00:00:00”, “수정일시”: “2023-12-08 16:12:13”}’)
준비되셨나요? 시작합니다. 😉
목차
- 1. 실습 준비
- 2. pgvector DB 생성
- 3. 장고 모델에 pgvector 적용
- 4. 빽다방 모델 및 최대 토큰수 유효성 검사
- 5. django-lifecycle hook을 통한 자동 임베딩
- 6. make_vector_store 명령 수정
- 7. 빽다방. 유사도 검색
- 8. 개선: 쿼리셋 문자열 표현 스타일 다듬기
- 9. 개선: make_vector_store 명령에서 다수의 INSERT 쿼리를 묶어서 실행
- 10. 참고: 배치 API 활용하여 비용 절감하기
- 11. Document 추상화 모델
- 12. 세법해석례 RAG
- 13. 감사합니다. 🤩