[RAG 시리즈] PGVector 와 프롬프트를 이용한 RAG 고도화

Judy·2024년 10월 11일
0

[글또] RAG 시리즈

목록 보기
1/4

RAG 기본 튜토리얼을 개선하여 보험 문서에 질의했을 때 더욱 정확하게 답변하고,
DB로 Postgres 및 벡터 스토어로 PGVector 를 사용하도록 개선합니다.

전체 코드는 튜토리얼로 만들어 GitHub 에 올려두었습니다.
https://github.com/Judy-Choi/rag_series.git

기본 튜토리얼

가장 기본적이고 유명한 Teddy Note 튜토리얼을 먼저 실행해 보겠습니다.

Code

VectorDB 로 ChromaDB 를, retriever 로 기본 retriever 를 사용합니다.

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 임베딩
embeddings = OpenAIEmbeddings()

# 저장할 경로 지정
DB_PATH = "./chroma_db"

# Chroma DB 에 저장
docsearch = Chroma.from_documents(texts, embeddings, persist_directory=DB_PATH, collection_name="my_db")
# retriever 가져옴
retriever = docsearch.as_retriever()

프롬프트 템플릿 또한 기본 템플릿을 이용했습니다.

# langchain hub 에서 Prompt 다운로드 예시
# https://smith.langchain.com/hub/rlm/rag-prompt

from langchain import hub

rag_prompt = hub.pull("rlm/rag-prompt")

프롬프트 템플릿

You are an assistant for question-answering tasks. 
Use the following pieces of retrieved context to answer the question. 
If you don't know the answer, just say that you don't know. 
Use three sentences maximum and keep the answer concise.
Question: {question} 
Context: {context} 
Answer:

LangChain 을 만들고, 질문을 입력해 테스트합니다.

# RAG chain 생성
from langchain.schema.runnable import RunnablePassthrough

# pipe operator를 활용한 체인 생성
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()} 
    | rag_prompt 
    | llm 
)
rag_chain.invoke("보험금의 지급사유를 알려 줘")

테스트 결과


AIMessage(content='보험금의 지급사유는 보험 약관에 따라 다르지만, 일반적으로 피보험자가 사고를 당하거나 손해를 입었을 때 지급됩니다. 그러나 피보험자나 계약자의 고의, 피보험자가 사고 후 도주, 자동차를 경기용이나 경기를 위한 연습용 또는 시험용으로 운전하던 중 사고, 도로교통법에 정한 음주․무면허 상태 또는 약물 상태에서 운전하던 중 사고, 자가용의 경우 피보험자가 자동차를 영업목적으로 운전하던 중 발생한 사고 등의 경우에는 보험금을 지급하지 않습니다.', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 248, 'prompt_tokens': 4906, 'total_tokens': 5154, 'completion_tokens_details': {'reasoning_tokens': 0}, 'prompt_tokens_details': {'cached_tokens': 0}}, 'model_name': 'gpt-4-0613', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-4d1282e2-2235-4d84-9c39-f89f012860ad-0')

보험 문서에 '보험금의 지급사유' 가 명시되어 있지만 정확한 답변을 제공하지 못합니다.

혹시 텍스트 청킹 과정에서 내용이 누락되었는지 확인하기 위해 ChromaDB 내용을 조회해 봅니다.

docsearch.get()

ChromaDB 조회 결과


{'ids': ['e5ea16d9-1075-4008-92c4-f66a529c7a3f',
  '6a76de34-a21b-46e4-b3e0-f104feb84fb8',
  '2a43e5e6-6c97-4e98-a0d7-16087825a3c3',

...
  '- 192 -2. 배상\n1) 일상(가족, 자녀)생활중 배상책임 관련      \n【사례5】\n피보험자가 차량 뒷자석에서 하차중 차량문을 열고 내리던중 옆차량을 파손한 사고로 약관 \n제0조 ‘항공기 , 선박, 차량, 총기의 소유, 사용, 관리로 인한 배상책임 ’은 면책\n⇒ 차량 하차중 개문발차사고는 자동차를 용법에 맞게 사용중 발생한 사고로 자동차 보험\n처리 적용 대상에 해당하여 일상생활 중 배상책임에서 보상되지 않습니다 .\n【사례6】\n피보험자 (미성년자 )가 돌로 차량에 낙서를 하여 차량에 피해를 준 사고\n⇒ 피보험자의 고의사고에 해당하여 보상하지 않으나 , 판례에 따라 책임무능력자는 사리분\n별이 안되므로 고의로 보기 힘들다 하여 12세 이하까지는 보상을 하고 있음\n3. 화재\n1) 화재보험의 도난담보 (명기가재 )관련  \n【사례7】\nK씨는 화재 및 도난을 보상받고자 보험가입을 하였으나 추후 귀금속 등 귀중품은 명기가\n재로 등록해야 보상이 가능하다고 내용을 알고 불만 제기\n⇒ 명기가재란 한점당 300만원 이상 고가의 가재로 보험가입시 해당 내용을 명확하게 서\n면으로 작성하셔야 하며, 서면으로 작성하지 않을 경우 보상에 문제가 있을 수 있습니다 .\n2) 화재보험의 화재의 정의 관련  \n【사례8】\n사용하는 열풍기 (전열기 )에 의해 피보험자의 소파 열변형이 발생한 사례로 약관에서 규정\n하는 화재의 정의에 대한 분쟁(피보험자는 본건 열변형이 화재라고 주장함 )\n⇒ 약관 해석상 화재는 연소현상이 있어야 하며 열변형은 화재에 해당하지 않습니다 .'],
 'uris': None,
 'data': None,
 'included': ['metadatas', 'documents']}

단순히 get() 을 이용해 DB를 조회하면 위와 같이 많은 양의 데이터를 조회하기에 불편합니다.

개선 튜토리얼

(Vector)DB 교체 : PGVector

DB로 Postgres 를 사용하고, VectorDB 로 PGVector 를 사용합니다.
(PG Vector 는 Postgres 에서 유사도 검색을 위해 사용됩니다.)

간단히 Postgres DB를 생성하기 위해 Docker 컨테이너를 만들어 띄웁니다.

docker-compose.yml

# Run this command to start the database:
# docker-compose up --build
version: "3"
services:
  db:
    hostname: 127.0.0.1
    image: pgvector/pgvector:pg16
    ports:
      # postgres 의 기본 포트
      # - 5432:5432
      # 현재 5432 포트 사용중인 경우 대체 포트 사용
      - 5433:5432
    restart: always
    environment:
      - POSTGRES_DB=rag_note
      - POSTGRES_USER=rag_note
      - POSTGRES_PASSWORD=rag_note
    volumes:
      # - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./postgres-data:/var/lib/postgresql/data

docker-compose up -d 명령어로 컨테이너를 실행하면
다음과 같이 컨테이너가 동작하는 것을 확인할 수 있습니다.

Vector store 에 연결하기 위한 계정 정보를 세팅합니다.

from langchain_postgres import PGVector
from langchain_postgres.vectorstores import PGVector
from langchain_openai import OpenAIEmbeddings

# See docker command above to launch a postgres instance with pgvector enabled.
# connection = f"postgresql+psycopg2://user:password@host:5432/name",
connection=f"postgresql+psycopg2://rag_note:rag_note@localhost:5433/rag_note"
collection_name = "my_db"

vector_store = PGVector(
    embeddings=OpenAIEmbeddings(model="text-embedding-3-large"),
    collection_name=collection_name,
    connection=connection,
    use_jsonb=True,
)

앞서 청킹한 텍스트들을 Vector store 에 저장합니다.

vector_store.add_documents(texts)

DBeaver 로 pgvector(벡터스토어) DB를 살펴보면 다음과 같이 자동으로 Langchain 용 테이블이 생성되고 데이터가 저장됩니다.

Retriever 검색 옵션 변경

더욱 정확한 답변을 위해 Retriever 의 검색 옵션을 변경해 봅니다.

similarity_search 메소드는 저장된 데이터 중에서 쿼리와 가장 유사한 문서 top k 개를 찾아 줍니다.

vector_store.similarity_search(query="보험금의 지급사유",k=3)

as_retriever 메서드는 VectorStore 객체를 기반으로 VectorStoreRetriever를 초기화하고 반환합니다. 이 메서드를 통해 다양한 검색 옵션을 설정하여 사용자의 요구에 맞는 문서 검색을 수행할 수 있습니다.

retriever = vector_store.as_retriever(
    search_type="mmr",
    search_kwargs={"k": 3, "fetch_k": 2, "lambda_mult": 0.5}, # 기본값
    search_kwargs={"k": 10, "fetch_k": 3, "lambda_mult": 0.5},
)
retriever.invoke("보험금의 지급사유")

검색 결과 (2가지 검색 옵션 결과 모두 동일)

[Document(id='9d76ddac-4cca-4f1c-b9bb-539186d18af5', metadata={'page': 13, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='- 3 -의하거나 또는 그 이전에 발생한 후유장해를 포함합니다 ), 후유장해보험금이 지급되지 않았\n던 피보험자에게 그 신체의 동일 부위에 또다시 제8항에 규정하는 후유장해상태가 발생하\n였을 경우에는 직전까지의 후유장해에 대한 후유장해보험금이 지급된 것으로 보고 최종 후\n유장해 상태에 해당되는 후유장해보험금에서 이를 차감하여 지급합니다 .\n【사 례】\n이 계약의 보장개시전의 원인에 의하거나 또는 그 이전에 발생한 장해로 후유장해보험금\n의 지급사유가 되지 않았던 장해 :\n보험가입 전 한 팔의 손목관절에 심한 장해(지급률 20%)가 있었던 피보험자가 보험가입 \n후 상해로 그 손목관절에 기능을 완전히 잃은 경우(지급률 30%)에는 보험가입 후 발생한 \n상해로 인한 장해지급률 30%에서 보험가입 전 발생한 장해지급률 20%를 차감한 10%에 \n해당하는 후유장해보험금을 지급\n⑩ 회사가 지급하여야 할 하나의 상해로 인한 후유장해보험금은 보험가입금액을 한도로 합니다 .\n제5조(보험금을 지급하지 않는 사유) \n① 회사는 다음 중 어느 한가지로 보험금 지급사유가 발생한 때에는 보험금을 지급하지 않습\n니다.\n 1. 피보험자가 고의로 자신을 해친 경우. 다만, 피보험자가 심신상실 등으로 자유로운 의사\n결정을 할 수 없는 상태에서 자신을 해친 경우에는 보험금을 지급합니다 .\n 2. 보험수익자가 고의로 피보험자를 해친 경우. 다만, 그 보험수익자가 보험금의 일부 보험\n수익자인 경우에는 다른 보험수익자에 대한 보험금은 지급합니다 .\n 3. 계약자가 고의로 피보험자를 해친 경우\n 4. 피보험자의 임신, 출산(제왕절개를 포함합니다 ), 산후기 . 그러나 , 회사가 보장하는 보험금 \n지급사유와 보장개시일부터 2년이 지난 후에 발생한 습관성 유산, 불임 및 인공수정 관\n련 합병증으로 인한 경우에는 보험금을 지급합니다 .\n【습관성 유산, 불임 및 인공수정 】\n 한국표준질병 ·사인분류상의 N96~N98에 해당하는 질병을 말합니다 . \n 5. 전쟁, 외국의 무력행사 , 혁명, 내란, 사변, 폭동\n② 회사는 다른 약정이 없으면 피보험자가 직업, 직무 또는 동호회 활동목적으로 아래에 열거\n된 행위로 인하여 제3조(보험금의 지급사유 )의 상해 관련 보험금 지급사유가 발생한 때에는 \n해당 보험금을 지급하지 않습니다 .\n 1. 전문등반 (전문적인 등산용구를 사용하여 암벽 또는 빙벽을 오르내리거나 특수한 기술, 경\n험, 사전훈련을 필요로 하는 등반을 말합니다 ), 글라이더 조종, 스카이다이빙 , 스쿠버다\n이빙, 행글라이딩 , 수상보트 , 패러글라이딩\n 2. 모터보트 , 자동차 또는 오토바이에 의한 경기, 시범, 흥행(이를 위한 연습을 포함합니다 ) \n또는 시운전 (다만, 공용도로상에서 시운전을 하는 동안 보험금 지급사유가 발생한 경우\n에는 보장합니다 )\n 3. 선박에 탑승하는 것을 직무로 하는 사람이 직무상 선박에 탑승하고 있는 동안\n제6조(보험금 지급사유의 통지) \n계약자 또는 피보험자나 보험수익자는 제3조(보험금의 지급사유 )에서 정한 보험금 지급사유의 \n발생을 안 때에는 지체없이 그 사실을 회사에 알려야 합니다 .\n제7조(보험금의 청구) \n① 보험수익자는 다음의 서류를 제출하고 보험금을 청구하여야 합니다 .\n 1. 청구서 (회사 양식)\n 2. 사고증명서 (진료비계산서 , 사망진단서 , 장해진단서 , 입원치료확인서 , 의사처방전 (처방조제\n비) 등)\n 3. 신분증 (주민등록증이나 운전면허증 등 사진이 붙은 정부기관발행 신분증 , 본인이 아닌 경\n우에는 본인의 인감증명서 또는 본인서명사실확인서 포함)'),
 Document(id='cb50dd4a-ed10-4aa6-8efb-d2a31cda2034', metadata={'page': 12, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='- 2 - 4. 기간과 날짜 관련 용어\n가. 보험기간 : 계약에 따라 보장을 받는 기간을 말합니다 .\n나. 영업일 : 회사가 영업점에서 정상적으로 영업하는 날을 말하며 , 토요일 , ‘관공서의 공휴\n일에 관한 규정’에 따른 공휴일과 근로자의 날을 제외합니다 .\n제2관 보험금의 지급\n제3조(보험금의 지급사유 )\n회사는 피보험자에게 다음 중 어느 하나의 사유가 발생한 경우에는 보험수익자에게 약정한 보\n험금을 지급합니다 .\n 1. 보험기간 중에 상해의 직접결과로써 사망한 경우(질병으로 인한 사망은 제외합니다 ): 사\n망보험금\n 2. 보험기간 중 상해로 장해분류표 (<별표1> 참조)에서 정한 각 장해지급률에 해당하는 장해\n상태가 되었을 때: 후유장해보험금 (장해분류표에서 정한 지급률을 보험가입금액에 곱하\n여 산출한 금액)\n제4조(보험금 지급에 관한 세부규정 ) \n① 제3조(보험금의 지급사유 ) 제1호 ‘사망’에는 보험기간에 다음 어느 하나의 사유가 발생한 \n경우를 포함합니다 .\n 1. 실종선고를 받은 경우: 법원에서 인정한 실종기간이 끝나는 때에 사망한 것으로 봅니다 .\n 2. 관공서에서 수해, 화재나 그 밖의 재난을 조사하고 사망한 것으로 통보하는 경우: 가족관\n계등록부에 기재된 사망연월일을 기준으로 합니다 .\n② 「호스피스 ·완화의료 및 임종과정에 있는 환자의 연명의료 결정에 관한 법률」에 따른 연명\n의료중단등결정 및 그 이행으로 피보험자가 사망하는 경우 연명의료중단등결정 및 그 이행\n은 제3조(보험금의 지급사유 ) 제1호 ‘사망’의 원인 및 ‘사망보험금 ’ 지급에 영향을 미치지 \n않습니다 .\n③ 제3조(보험금의 지급사유 ) 제2호에서 장해지급률이 상해 발생일부터 180일 이내에 확정되\n지 않는 경우에는 상해 발생일부터 180일이 되는 날의 의사 진단에 기초하여 고정될 것으\n로 인정되는 상태를 장해지급률로 결정합니다 . 다만, 장해분류표 (<별표1> 참조)에 장해판정\n시기를 별도로 정한 경우에는 그에 따릅니다 .\n④ 제3항에 따라 장해지급률이 결정되었으나 그 이후 보장받을 수 있는 기간(계약의 효력이 \n없어진 경우에는 상해 발생일부터 1년 이내)에 장해상태가 더 악화된 때에는 그 악화된 장\n해상태를 기준으로 장해지급률을 결정합니다 .\n⑤ 장해분류표에 해당되지 않는 후유장해는 피보험자의 직업, 연령, 신분 또는 성별 등에 관계\n없이 신체의 장해정도에 따라 장해분류표의 구분에 준하여 지급액을 결정합니다 . 다만, 장\n해분류표의 각 장해분류별 최저 지급률 장해정도에 이르지 않는 후유장해에 대하여는 후유\n장해보험금을 지급하지 않습니다 .\n⑥ 보험수익자와 회사가 제3조(보험금의 지급사유 )의 보험금 지급사유에 대해 합의하지 못할 \n때는 보험수익자와 회사가 함께 제3자를 정하고 그 제3자의 의견에 따를 수 있습니다 . 제3\n자는 의료법 제3조(의료기관 )에 규정한 종합병원 소속 전문의 중에 정하며 , 보험금 지급사\n유 판정에 드는 의료비용은 회사가 전액 부담합니다 .\n⑦ 같은 상해로 두 가지 이상의 후유장해가 생긴 경우에는 후유장해 지급률을 더하여 지급합\n니다. 다만, 장해분류표의 각 신체부위별 판정기준에 별도로 정한 경우에는 그 기준에 따릅\n니다.\n⑧ 다른 상해로 인하여 후유장해가 2회 이상 발생하였을 경우에는 그 때마다 이에 해당하는 \n후유장해지급률을 결정합니다 . 그러나 그 후유장해가 이미 후유장해보험금을 지급받은 동일\n한 부위에 가중된 때에는 최종 장해상태에 해당하는 후유장해보험금에서 이미 지급받은 후\n유장해보험금을 차감하여 지급합니다 . 다만, 장해분류표의 각 신체부위별 판정기준에서 별\n도로 정한 경우에는 그 기준에 따릅니다 .\n⑨ 이미 이 계약에서 후유장해보험금 지급사유에 해당되지 않았거나 (보장개시 이전의 원인에'),
 Document(id='eac8577c-d0e1-44a7-82d1-8572bd409335', metadata={'page': 14, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='- 4 - 4. 기타 보험수익자가 보험금의 수령에 필요하여 제출하는 서류(사망보험금 지급시 피보험\n자의 법정상속인이 아닌자가 청구하는 경우 법정상속인의 확인서 )\n② 제1항 제2호의 사고증명서는 의료법 제3조(의료기관 )에서 규정한 국내의 병원이나 의원 또\n는 국외의 의료관련법에서 정한 의료기관에서 발급한 것이어야 합니다 .\n제8조(보험금의 지급절차 ) \n① 회사는 제7조(보험금의 청구)에서 정한 서류를 접수한 때에는 접수증을 드리고 휴대전화 문\n자메시지 또는 전자우편 등으로도 송부하며 , 그 서류를 접수한 날부터 3영업일 이내에 보\n험금을 지급합니다 .\n② 회사가 보험금 지급사유를 조사․확인하기 위해 필요한 기간이 제1항의 지급기일을 초과할 \n것이 명백히 예상되는 경우에는 그 구체적인 사유와 지급예정일 및 보험금 가지급제도 (회사\n가 추정하는 보험금의 50% 이내를 지급)에 대하여 피보험자 또는 보험수익자에게 즉시 통\n지합니다 . 다만, 지급예정일은 다음 각 호의 어느 하나에 해당하는 경우를 제외하고는 제7\n조(보험금의 청구)에서 정한 서류를 접수한 날부터 30영업일 이내에서 정합니다 .\n 1. 소송제기\n 2. 분쟁조정 신청\n【분쟁조정 신청】\n분쟁조정 신청은 이 약관의 「분쟁의 조정」조항에 따르며 분쟁조정 신청 대상기관은 금융\n감독원의 금융분쟁조정위원회를 말합니다 .\n 3. 수사기관의 조사 \n 4. 해외에서 발생한 보험사고에 대한 조사\n 5. 제6항에 따른 회사의 조사요청에 대한 동의 거부 등 계약자 , 피보험자 또는 보험수익자\n의 책임있는 사유로 보험금 지급사유의 조사와 확인이 지연되는 경우\n 6. 제4조(보험금 지급에 관한 세부규정 ) 제6항에 따라 보험금 지급사유에 대해 제3자의 의\n견에 따르기로 한 경우\n③ 제2항에 의하여 장해지급률의 판정 및 지급할 보험금의 결정과 관련하여 확정된 장해지급\n률에 따른 보험금을 초과한 부분에 대한 분쟁으로 보험금 지급이 늦어지는 경우에는 보험\n수익자의 청구에 따라 이미 확정된 보험금을 먼저 가지급합니다 .\n④ 제2항에 의하여 추가적인 조사가 이루어지는 경우, 회사는 보험수익자의 청구에 따라 회사\n가 추정하는 보험금의 50% 상당액을 가지급보험금으로 지급합니다 .\n【가지급보험금 】\n보험금이 지급기한 내에 지급되지 못할 것으로 판단되는 경우 회사가 예상되는 보험금의 \n일부를 먼저 지급하는 제도로 피보험자가 필요로 하는 비용을 보전해 주기 위해 회사가 먼\n저 지급하는 임시 교부금을 말합니다 .\n⑤ 회사는 제1항에서 정한 지급기일내에 보험금을 지급하지 않았을 때(제2항에서 정한 지급예\n정일을 통지한 경우를 포함합니다 )에는 그 다음날부터 지급일까지의 기간에 대하여 <부표> \n‘보험금을 지급할 때의 적립이율 ’에 따라 연단위 복리로 계산한 금액을 보험금에 더하여 지\n급합니다 . 다만, 계약자 , 피보험자 또는 보험수익자에게 책임이 있는 사유로 지급이 지연된 \n경우에는 그 기간에 대한 이자는 지급하지 않습니다 .\n 기     간 지 급 이 자\n지급기일의 다음 날부터 30일 이내 기간 보험계약대출이율\n지급기일의 31일이후부터 60일이내 기간 보험계약대출이율 + 가산이율 (4.0%)\n지급기일의 61일이후부터 90일이내 기간 보험계약대출이율 + 가산이율 (6.0%)\n지급기일의 91일이후 기간 보험계약대출이율 + 가산이율 (8.0%)<부표> 보험금을 지급할 때의 적립이율')]

2-5-1-1. 유사도 기반 검색 (Similarity search)
01. 벡터스토어 기반 검색기(VectorStore-backed Retriever)

도메인에 맞는 프롬프트 템플릿 작성

다음으로 보험 도메인에 맞는 프롬프트를 작성합니다.

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.messages import SystemMessage

system_prompt = SystemMessage(content=
        """당신은 전문 상담원입니다. 아래 지침에 따라 사용자의 질문에 답변을 제공하세요.
        ---------------------
        1. 주어진 정보만 활용하여 답변을 제공하세요. 주어진 정보로 답변을 할 수 없는 경우, 정중하게 답변을 제공할 수 없다고 설명합니다.
        2. 답변은 정제된 형식과 문어체로 작성하며, 친절하고 자세한 내용을 제공합니다.
        ---------------------
        """
)

template = (
        "Below is the context information.\n"
        "---------------------\n"
        "{context}"
        "\n---------------------\n"
        "Given the context information, provide a most relevant chunk to {query}."
        "If there is no title that matches, output '해당정보 존재하지 않음'."
        "Do not include the title on your final output."
)

prompt = ChatPromptTemplate.from_messages([system_prompt, template])

개선 결과

LangChain 생성 & 테스트

def format_docs(docs):
    return "\n\n".join([d.page_content for d in docs])

chain = (
        {"context": retriever | format_docs, "query": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser()
    )
chain.invoke("보험금의 지급사유")

테스트 결과


'회사는 피보험자에게 다음 중 어느 하나의 사유가 발생한 경우에는 보험수익자에게 약정한 보험금을 지급합니다 .\n 1. 보험기간 중에 상해의 직접결과로써 사망한 경우(질병으로 인한 사망은 제외합니다 ): 사망보험금\n 2. 보험기간 중 상해로 장해분류표 (<별표1> 참조)에서 정한 각 장해지급률에 해당하는 장해상태가 되었을 때: 후유장해보험금 (장해분류표에서 정한 지급률을 보험가입금액에 곱하여 산출한 금액)'

답변이 더욱 정확하고 매끄럽게 생성된 점을 확인할 수 있습니다.

Reference

랭체인(langchain) + PDF 기반 질의응답(Question-Answering) (8)
Retrievers
PGVectorStore

profile
NLP Researcher

0개의 댓글