Post

RAG Code(Use Llama)

RAG Code(Use Llama)

Data Load

1
2
3
4
5
6
7
8
# GPU 할당
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3"

import torch
print(f"pytorch에서 사용 가능한 GPU 개수 확인 : {torch.cuda.device_count()}")
print(f"현재 기본 GPU(Device) 확인 : {torch.cuda.current_device()}")
print(f"GPU 이름(모델명) 확인 : {torch.cuda.get_device_name(0)}")
1
2
3
pytorch에서 사용 가능한 GPU 개수 확인 : 1
현재 기본 GPU(Device) 확인 : 0
GPU 이름(모델명) 확인 : NVIDIA GeForce RTX 4090
1
2
from huggingface_hub import login
login()
1
VBox(children=(HTML(value='<center> <img\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.sv…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import warnings
warnings.filterwarnings(action = 'ignore')

# Library

# type/util
from typing import List, Dict, Any
from collections import defaultdict

# Data Load & Proceeding
import pandas as pd
import os, json, re


# Text Split(Sentence/Chunk)
from sentence_splitter import SentenceSplitter                       # 문장 분리를 위한 라이브러리
from langchain_text_splitters import RecursiveCharacterTextSplitter

# Model
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline  
from langchain_core.documents import Document                           # LangChain Document 사용

# 모델 ID 및 설정
MODEL_ID = "meta-llama/Llama-3.1-8B-Instruct"
# LLama 3의 토큰 제한(256)
# Data의 문장 길이를 고려하여 max_new_tokens는 100으로 설정
MAX_NEW_TOKENS = 150
1
2
3
4
5
6
7
8
9
10
11
12
2026-01-22 16:43:52.200332: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2026-01-22 16:43:52.203984: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.
2026-01-22 16:43:52.211522: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:467] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1769067832.223950  178836 cuda_dnn.cc:8579] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
E0000 00:00:1769067832.227641  178836 cuda_blas.cc:1407] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
W0000 00:00:1769067832.237118  178836 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
W0000 00:00:1769067832.237128  178836 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
W0000 00:00:1769067832.237129  178836 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
W0000 00:00:1769067832.237130  178836 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
2026-01-22 16:43:52.240612: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
1
2
df = pd.read_csv("./Data/documents.csv", encoding = 'cp949')
df
문서범주>카테고리>상품명>상품약관 파일명
0적 용 이 율\n기본이율 (영업점 및 홈페이지 고시금리) + 우대이율\n※ 이율은 ...상품공시실>예금상품>입출금자유상품>················이득통장>················이득...
1제16조 위험 부담 및 면책조항\n① 채무자가 발행, 배서, 인수, 참가인수나 보증...금융상품몰>대출>················ 중견기업 혁신성장 지원금>여신거래기본약관(기업용)
2제7조 기한전의 채무변제의무\n※ 본 조문의 조항 중 밑줄로 표시된 부분은 공정거래...금융상품몰>대출>혁신성장산업지원자금>여신거래기본약관(기업용)
3거 래 중 지\n_ 다음의 경우에 해당하는 경우 입출금, , 잔액조회 이관 등의 거...금융상품몰>예금>················ 비대면 입출금통장>상품설명서
4휴면예금 및 출연\n- 이자지급을 포함한 최종거래일 이후 5년 이내 계좌를 해지하지...금융상품몰>예금>················ 비대면 입출금통장>상품설명서
5제1관 목적 및 용어의 정의\n제1조 (목적)\n① 이 보험계약(이하 ‘계약’이라 ...금융상품몰>보험>················하이브리드연금보험 24.01 (무배당,거치형)[B...
6양도담보계약서\n담보제공자 양도담보권설정자 가 꼭 알아두어야 할 사항\n양도담보란\...약관|소비자보호/고객센터>서식자료>개인대출>양도담보계약서(가계용)
7탈퇴 회원\n회원의 요청에 의한 해지·정지·탈회 및 신용카드 자격의 조건 변경에 따...금융상품몰>카드>················ Super Check카드>상품설명서\n
8Q1. 기업대출의 자금용도별 구분은 어떻게 되나요?\n1. 운영자금 대출 \n-원재...금융상품몰>대출>················지원자금>기업대출 상품설명서
9상품명 : ················ Nice 정기예금\n- dc/irp : 이 퇴직연금은...퇴직연금>상품안내>원리금보장상품> ················ Nice 정기예금 상품설명서\n
10상품명 : ················ Nice 정기예금\n- db : 이 퇴직연금은 예금자...퇴직연금>상품안내>원리금보장상품> ················ Nice 정기예금 약관

Data Preprocessing

Text Preprocessing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# "범주>>카테고리>상품명>상품약관 파일명"column의 첫 번째 value값이 ················t이득통장 중복 제거
# "상품공시실>예금상품>입출금자유상품>················이득통장>················이득통장 상품설명서" → "상품공시실>예금상품>입출금자유상품>················이득통장 상품설명서"
df['범주>카테고리>상품명>상품약관 파일명'][0] = "상품공시실>예금상품>입출금자유상품>················이득통장 상품설명서"

df.columns = ['text', 'source']

# 텍스트 정제
df['text'] = (
    df['text']
        .str.replace('\n', '', regex = False)  # 줄 바꿈(\n) 제거
        .replace('\r', ' ', regex = False)     # 캐리지 리턴(\r)을 공백으로 치환 | 캐리지 리턴(\r) : 줄을 바꾸지 않고 커서를 앞으로 되돌리는 제어 문자
        .replace(r'\s+', ' ', regex = True)    # 연속된 공백 문자들을 하나의 공백으로
        .str.strip()                           # 앞뒤 공백 제거
    )

Create Document

1
2
3
4
5
6
7
8
9
10
11
12
13
raw_documents = []

for index, row in df.iterrows():  # iterrows : df를 행 단위로 순회
    cleaned_text = row['text']
    source = row['source']

    # Document : RAG 파이프라인에서 책임을 질 수 있는 텍스트 단위
    if cleaned_text:
        raw_documents.append(Document(
            page_content = cleaned_text,
            metadata = {"source" : source, 
                        'doc_id' : f"doc_{index}"}
        ))

Chunking

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 긴 문서를 LLM 입력 크기에 맞게 구성
text_splitter = RecursiveCharacterTextSplitter(
    separators = ["\n\n", "\n", ".", " "],  # 문단, 문장 기준으로 우선 분할
    chunk_size = 150,                       # Data의 Text길이를 고려한 크기
    chunk_overlap = 30,                     # 오버랩 설정 | 앞 청크 5자를 다음 청크에 겹침(문맥 단절 방지)
    length_function = len,                  # 길이를 문자(character) 수로 계산 (가장 보수적인 방법)
    is_separator_regex = False
)

# 청킹 실행
chunks = text_splitter.create_documents([doc.page_content for doc in raw_documents],
                                         metadatas = [doc.metadata for doc in raw_documents])

final_chunks = []
for i, chunk in enumerate(chunks):
    # LangChain Document와 유사하게 page_content와 metadata를 가진 객체로 변환
    doc_id = chunk.metadata['doc_id']
    final_chunks.append(Document(
        page_content = chunk.page_content,
        metadata = {**chunk.metadata, "chunk_id": f"{doc_id}-chunk_{i}"}
    ))

# chunked_docs = final_chunks
  • chunks
    • 하나의 문서 → 여러 개의 작은 Document
    • Meta Data는 그대로 유지m

LLM

Llama Model Load

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def setup_llama_pipeline():
    print("모델 로드")
    try:
        # MODEL_ID에 해당하는 사전 학습된 LLaMA 모델의 토크나이저 불러오기
        # HuggingFace Hub에서 해당 모델에 맞는 토크나이저 파일을 다운로드하고 로드
        tokenizer = AutoTokenizer.from_pretrained(
            MODEL_ID,
            local_files_only = False  # 기본값
        )

        # HuggingFace Hub에서 해당 모델을 로드
        model = AutoModelForCausalLM.from_pretrained(
            MODEL_ID,
            torch_dtype = torch.float16,  # 모델 연산에 사용할 데이터 타입
            device_map = "auto",          # 모델을 가능한 GPU/CPU 자원에 자동으로 분배
            local_files_only = False      # local에 이미 있으면 캐시 사용, 없으면 다운로드
        )

        # 텍스트 생성용 파이프라인 생성
        llama_pipeline = pipeline(
            "text-generation",                     # 수행할 태스크 유형
            model = model,                         # 사용할 언어 모델 (Llama)
            tokenizer = tokenizer,                 # 사용할 토크나이저
            max_new_tokens = MAX_NEW_TOKENS,       # 한 번에 생성할 최대 토큰 수 (출력 길이 제한)
            do_sample = True,                      # True(다양하고 창의적인 답변) : 확률 기반 샘플링으로 생성 | False(일관되고 결정적인 답변) : 확률이 가장 높은 토큰을 선택(greedy / dterministic)
            temperature = 0.7,                     # 생성 다양성 조절 (낮으면 보수적, 높으면 창의적)
            top_k = 50,                            # 확률 상위 50개의 후보만 고려하여 샘플링 (랜덤성 제어)
            eos_token_id = tokenizer.eos_token_id  # 문장 종료 토큰 (End Of Sequence) 설정
        )
        print("Complete")
        return llama_pipeline, tokenizer
    except Exception as e:
        print(f"Error {e}")
        return None, None

# 파이프라인 및 토크나이저 전역 변수 설정
llama_pipeline, tokenizer = setup_llama_pipeline()
1
2
3
4
5
6
7
8
9
모델 로드

`torch_dtype` is deprecated! Use `dtype` instead!

Loading checkpoint shards:   0%|          | 0/4 [00:00<?, ?it/s]

Device set to use cuda:0

Complete

Conditional_QA_Prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
CONDITIONAL_QA_PROMPT = """
[CONTEXT]에 주어진 금융 약관 텍스트를 면밀히 분석하여, 다음 조건에 맞는 질문과 정답을 JSON 형식으로 생성해주세요.

1. 질문은 반드시 **'만약 ~라면, 어떻게 되는가?'** 형태의 조건부 질문이어야 하며, 수치, 기간, 또는 제한 조건을 포함해야 합니다.
2. 질문과 정답은 [CONTEXT] 내의 정보만을 바탕으로 생성되어야 합니다.
3. 응답은 **JSON 형식**이어야 합니다.

[CONTEXT]:
{context}

**출력 형식 (JSON):**
question
"""

QA Generation Function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 안정화된 QA 생성 함수
def generate_qa_pair_llama_safe(llama_pipeline, chunk: Document, prompt_template: str, max_retries: int = 2) -> Dict[str, Any] | None:
    """
    Document 청크를 입력으로 LLM을 통해 조건부 QA 생성.
    JSON parsing 실패나 모델 출력을 일부 잘못 생성해도 최대 max_retries 재시도.
    """
    if not llama_pipeline: 
        return None

    context_text = chunk.page_content
    chunk_id = chunk.metadata.get('chunk_id', 'unknown_chunk')

    formatted_prompt = prompt_template.format(context=context_text, chunk_id=chunk_id)

    # LLaMA 3 Chat 메시지 구성
    messages = [
        {"role": "system", "content": "당신은 RAG 평가용 금융 규정 전문가입니다. 응답은 반드시 요청된 JSON 형식만 포함해야 합니다."},
        {"role": "user", "content": formatted_prompt}
    ]

    for attempt in range(max_retries):
        try:
            # 텍스트 생성
            prompt_text = llama_pipeline.tokenizer.apply_chat_template(
                messages,
                tokenize = False,
                add_generation_prompt = True
            )
            response = llama_pipeline(prompt_text)
            generated_text = response[0]['generated_text']

            # JSON 블록 추출 (마지막 { ... } 형태)
            match = re.search(r'\{.*\}', generated_text, re.DOTALL)
            if not match:
                raise ValueError(f"JSON 블록을 찾을 수 없습니다: {generated_text[:150]}...")

            matches = re.findall(r'\{[\s\S]*?\}', generated_text)
            if not matches:
                raise ValueError("JSON 블록 없음")
            
            json_str = matches[-1]   # ⭐ 마지막 JSON만 사용

            # json_str = match.group(0)

            # # JSON 파싱 시 오류를 방지하기 위해 작은 preprocessing
            # json_str = re.sub(r",\s*}", "}", json_str)  # trailing comma 제거
            # json_str = re.sub(r",\s*]", "]", json_str)  # trailing comma 제거

            qa_data = json.loads(json_str)

            # context 및 출처 메타데이터 추가
            qa_data['context'] = [context_text]
            qa_data['source_chunk_ids'] = [chunk_id]

            return qa_data

        except Exception as e:
            print(f"[경고] QA 생성 실패 (Chunk ID: {chunk_id}, 시도: {attempt+1}): {e}")
            if attempt == max_retries - 1:
                print(f"[오류] 최대 재시도 초과, 해당 청크 건너뜀: {chunk_id}")
                return None
            else:
                print("재시도 중...")

    return None

# 전체 청크를 대상으로 안정화된 평가 데이터셋 생성
def generate_eval_dataset_safe(llama_pipeline, chunks: List[Document], num_per_chunk: int = 1) -> List[Dict[str, Any]]:
    eval_dataset = []
    for i, chunk in enumerate(chunks):
        if i % 10 == 0:
            print(f"--- 진행 상황: {i}/{len(chunks)} 청크 처리 중 ---")
        for _ in range(num_per_chunk):
            qa_pair = generate_qa_pair_llama_safe(llama_pipeline, chunk, CONDITIONAL_QA_PROMPT)
            if qa_pair:
                eval_dataset.append(qa_pair)
    print(f"총 생성된 QA 수: {len(eval_dataset)}")
    return eval_dataset

#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def run_full_pipeline(file_path: str, output_file: str):
    """전체 데이터셋 생성 파이프라인을 실행합니다."""
    if not llama_pipeline:
        print("파이프라인 실행 불가: Llama 모델이 성공적으로 로드되지 않았습니다.")
        return

    # 1. 평가 데이터셋 생성
    final_dataset = generate_eval_dataset_safe(llama_pipeline, ch, num_per_chunk = 1)

    # 2. 결과 저장
    with open(output_file, 'w', encoding = 'utf-8') as f:
        json.dump(final_dataset, f, ensure_ascii = False, indent = 2)

    print(f"\n=======================================================")
    print(f"✅ 최종 데이터셋 생성 완료: {len(final_dataset)}개 항목")
    print(f"파일 저장 경로: {output_file}")
    print(f"=======================================================")

# --- 파이프라인 실행 ---
INPUT_FILE = './Data/documents.csv'
OUTPUT_FILE = './Result/generated_eval_dataset.json'

# 파일이 현재 Colab 환경에 업로드되어 있어야 합니다.
run_full_pipeline(INPUT_FILE, OUTPUT_FILE)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.

--- 진행 상황: 0/36 청크 처리 중 ---

Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.

--- 진행 상황: 10/36 청크 처리 중 ---

Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.

--- 진행 상황: 20/36 청크 처리 중 ---

Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.

[경고] QA 생성 실패 (Chunk ID: doc_4-chunk_21, 시도: 1): Expecting ',' delimiter: line 2 column 23 (char 24)
재시도 중...

Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.

--- 진행 상황: 30/36 청크 처리 중 ---

Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.

총 생성된 QA 수: 36

=======================================================
✅ 최종 데이터셋 생성 완료: 36개 항목
파일 저장 경로: ./Result/generated_eval_dataset.json
=======================================================
1
2
3
4
import json
with open('./Result/generated_eval_dataset.json', 'r', encoding = 'cp949') as f:
    json_data = json.load(f)
print(json.dumps(json_data, ensure_ascii = False, indent = "\t"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
[
    {
        "question": "만약 기본 이율이 '24.07'이라고 가정하면, 우대이율은 얼마인가?",
        "answer": "우대이율은 기본 이율에 포함되어 있지 않으므로, 이 정보는 제공되지 않습니다.",
        "question_type": "Conditional QA",
        "context": [
            "적 용 이 율기본이율 (영업점 및 홈페이지 고시금리) + 우대이율※ 이율은 시장금리동향 등에 따라 변경될 수 있으므로 가입시점의 , 이율을 확인하시기 바랍니다.기 본 이 율(‘24.07"
        ],
        "source_chunk_ids": [
            "doc_0-chunk_0"
        ]
    },
    {
        "question": "만약 ················ 회선 유지비가 200만원 초과라면, 연간 이율은 얼마인가?",
        "answer": "0.50%",
        "question_type": "Conditional QA",
        "context": [
            ".기 본 이 율(‘24.07.05 기준) 가입시 인증한 ················ 회선 유지시 - 200만원 이하 연 1.00% (세전) - 200만원 초과 연 0.50% (세전)가입시 인증한 ················ 회선 미유지시 - 연 0"
        ],
        "source_chunk_ids": [
            "doc_0-chunk_1"
        ]
    },
    {
        "question": "················ 회선을 해지하거나 명의를 변경하면, 그 이후에 본인 명의로 다른 ················ 회선을 가입했을 때, 기본이율이 적용되는지 궁금하다면?",
        "answer": "아니요, 미유지 시 기본이율이 적용됩니다.",
        "question_type": "Conditional QA",
        "context": [
            ".10% (세전)※ 가입시 인증한 ················ 회선을 해지 또는 명의변경 한 경우 회선 미유지 에는 추후본인 명의의 또 ················ 다른 회선에 가입하더라도 회선 미유지시 의 기본이율이 적용됩니다."
        ],
        "source_chunk_ids": [
            "doc_0-chunk_2"
        ]
    },
    {
        "question": "은행의 책임없는 사유로 인해 어음이 분실, 손상, 멸실 또는 연착하면 채무자는 어떻게 되는가?",
        "answer": "은행의 장부, 전표에 대해 책임이 면책된다.",
        "question_type": "Conditional QA",
        "context": [
            "제16조 위험 부담 및 면책조항① 채무자가 발행, 배서, 인수, 참가인수나 보증한 어음 또는 채무자가 은행에 제출한 제 증서등이 불가항력, 사변, 재해, 수송도중의 사고 등 은행의 책임없는 사유로 인하여 분실, 손상, 멸실 또는 연착한 경우 채무자는 은행의 장부_전표"
        ],
        "source_chunk_ids": [
            "doc_1-chunk_3"
        ]
    },
    {
        "question": "은행의 장부ㆍ전표 등의 기록에 의한 채무 변제를 할 경우, 채무자는 어떻게 되는가?",
        "answer": "채무를 변제하기로 합니다.",
        "question_type": "Conditional QA",
        "context": [
            "멸실 또는 연착한 경우 채무자는 은행의 장부_전표 등의 기록에 의하여 채무를 변제하기로 하되, 채무자가 은행의 장부ㆍ전표 등의 기록과 다른 자료를 제시할 경우 은행의 기록과 채무자가 제시하는 자료를 상호 대조하여 채무를 확정한 후 변제하기로 합니다"
        ],
        "source_chunk_ids": [
            "doc_1-chunk_4"
        ]
    },
    {
        "question": "채무자가 어음이나 증서를 제출하지 않는다면, 어떻게 되는가?",
        "answer": "은행은 채무자의 채무 청구에 따라 채무자에게 제재를 가할 수 있습니다.",
        "question_type": "Conditional QA",
        "context": [
            ". ② 채무자는 제1항의 분실, 손상, 멸실의 경우에 은행의 청구에 따라 곧 그에 대신할 어음이나 증서 등을 제출하기로 합니다. 다만, 은행이 제3자와의 거래에서 취득한 어음이나 증서의 경우에는 그러하지 아니합니다"
        ],
        "source_chunk_ids": [
            "doc_1-chunk_5"
        ]
    },
    {
        "question": "채무자가 과실없이 이중의 지급의무를 부담하게 되면 은행은 어떠한 손해를 부담해야 하는가?",
        "answer": "은행은 이중의 지급의무로 인한 손해를 부담합니다.",
        "question_type": "Conditional QA",
        "context": [
            ". ③ 제1항 및 제2항에 의한 변제 또는 어음이나 증서의 제출로 인하여 채무자가 과실없이 이중의 지급의무를 부담하게 됨으로 말미암은 손해는 은행이 부담하기로 합니다"
        ],
        "source_chunk_ids": [
            "doc_1-chunk_6"
        ]
    },
    {
        "question": "만약 위조, 변조, 도용 등의 사고가 발생했을 때, 누구가 손해를 부담해야 하는가? 라면, 채무자가 부담해야 하는가?",
        "answer": "네, 채무자가 부담해야 한다.",
        "question_type": "Conditional QA",
        "context": [
            ". ④ 은행이 어음이나 제 증서 등의 인영_서명을 채무자가 미리 신고한 인감_서명과 상당한 주의로써 대조하고 틀림없다고 인정하여 거래한 때에는 어음_증서 등과 도장_서명에 관하여위조, 변조, 도용 등의 사고가 있더라도 이로 말미암은 손해는 채무자가 부담하며 채무자는"
        ],
        "source_chunk_ids": [
            "doc_1-chunk_7"
        ]
    },
    {
        "question": "만약 채무자가 어음 또는 증서 등의 기재문언에 따라 책임을 지지 않으면, 어떻게 되는가?",
        "answer": "이로 말미암은 손해는 채무자가 부담하지 않습니다.",
        "question_type": "Conditional QA",
        "context": [
            "이로 말미암은 손해는 채무자가 부담하며 채무자는 어음 또는 증서 등의 기재문언에 따라 책임을 지기로 합니다"
        ],
        "source_chunk_ids": [
            "doc_1-chunk_8"
        ]
    },
    {
        "question": "만약 기한이 전의 채무변제의무가 발생하면, 채무자는 어떤 조치를 취해야 하는가?",
        "answer": "채무자는 기한 전의 채무변제의무가 발생하면 채무변제의무를 이행하여야 한다.",
        "question_type": "Conditional QA",
        "context": [
            "제7조 기한전의 채무변제의무※ 본 조문의 조항 중 밑줄로 표시된 부분은 공정거래위원회의「은행여신거래기본약관(기업용)」 표준약관과 다르게 정하고 있습니다"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_10"
        ]
    },
    {
        "question": "채무자가 지급보증거래에 있어서의 사전구상채무가 발생하면, 어떻게 되는가?",
        "answer": "채무자는 은행으로부터의 독촉_통지 등이 없어도 당연히 은행에 대한 모든 채무의 기한의 이익을 상실한다.",
        "question_type": "Conditional QA",
        "context": [
            ". 채무자에 관하여 다음 각호의 사유중 하나라도 발생한 경우에는, 채무자는 은행으로부터의 독촉_통지 등이 없어도 당연히 은행에 대한 모든 채무의 기한의 이익을 상실하여(지급보증거래에 있어서의 사전구상채무 발생, 유가증권대여에 있어서의 기한전의 대여 증권반환의무 및"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_11"
        ]
    },
    {
        "question": "만약 유가증권대여 기한이 3일 미만일 때, 대여 증권의 반환이 미흡하면 어떻게 되는가?",
        "answer": "대여 증권의 반환이 미흡하면 유가증권대여 기한의 미흡이 발생한다.",
        "question_type": "Conditional QA",
        "context": [
            "유가증권대여에 있어서의 기한전의 대여 증권반환의무 및 대여증권상에 설정하였던 담보권설정등록의 말소의무 발생을 포함합니다"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_12"
        ]
    },
    {
        "question": "만약 금융 약관에 따라 변제(또는 이행)를 하지 못한다면, 어떻게 되는가?",
        "answer": "변제(또는 이행)를 하지 못하는 경우, 변제(또는 이행)를 하지 못한 책임을 지게 됩니다.",
        "question_type": "Conditional QA",
        "context": [
            ". 이하 같습니다.) 곧 이를 변제(또는 이행)할 의무를 지기로 합니다. 1"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_13"
        ]
    },
    {
        "question": "만약 제 예치금 등에 가압류가 발송된 경우, 담보재산이 존재할 때 채권회수에 중대한 지장이 없는 경우에는 어떻게 되는가?",
        "answer": "기한의 이익을 상실하지 않습니다.",
        "question_type": "Conditional QA",
        "context": [
            ". 1. 은행에 대한 제 예치금 기타의 채권(이하 \"제 예치금 등\"이라 합니다)에 대하여 가압류_ 압류 명령이나 체납처분압류통지가 발송된 때 다만, 가압류의 경우 담보재산이 존재하는 때에는 채권회수에 중대한 지장이 있는 경우에만 기한의 이익을 상실합니다. 2"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_14"
        ]
    },
    {
        "question": "만약 채무자가 제공한 담보재산에 대하여 강제집행 또는 담보권실행 등을 위한 경매의 개시결정이나 체납처분의 착수가 있으면, 어떻게 되는가?",
        "answer": "파산_회생_개인회생절차개시의 신청이 있거나 채무불이행자 명부등재의 신청이 있습니다.",
        "question_type": "Conditional QA",
        "context": [
            ". 2. 채무자가 제공한 담보재산에 대하여 강제집행 또는 담보권실행 등을 위한 경매의 개시결정이나 체납처분의 착수가 있는 때3. 파산_회생_개인회생절차개시의 신청이 있거나 채무불이행자 명부등재의 신청이 있는 때4"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_15"
        ]
    },
    {
        "question": "만약 폐업, 도피 기타의 사유로 지급을 정지한 것으로 인정된 때라면, 어떻게 되는가?",
        "answer": "지급을 정지한다.",
        "question_type": "Conditional QA",
        "context": [
            ". 조세공과에 관하여 납기전 납부고지를 받거나 어음교환소의 거래정지처분이 있는 때5. 폐업_도피 기타의 사유로 지급을 정지한 것으로 인정된 때6. 채무자의 과점주주나 실질적인 기업주인 포괄근보증인의 은행에 대한 제 예치금 등에 대하여 제1호의 사유가 발생한 때7"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_16"
        ]
    },
    {
        "question": "만약 법령에 의하여 기한의 이익을 상실하게 된 때, 어떤 절차를 거쳐야 하나?",
        "answer": "해당 절차는 법령에 의하여 정해진 절차를 따라야 합니다.",
        "question_type": "Conditional QA",
        "context": [
            ". 법령에 의하여 기한의 이익을 상실하게 된 때"
        ],
        "source_chunk_ids": [
            "doc_2-chunk_17"
        ]
    },
    {
        "question": "만약 예금잔액이 원미만이며 년이상 입출금거래가 없는 계좌라면, 입출금 제한은 얼마인가?",
        "answer": "10,000",
        "question_type": "Conditional QA",
        "context": [
            "거 래 중 지_ 다음의 경우에 해당하는 경우 입출금, , 잔액조회 이관 등의 거래 제한 (1) 10,000 , 1 예금잔액이 원미만이며 년이상 입출금거래가 없는 계좌 (2) 예금잔액이 10,000 50,000 , 2 원이상 원미만이며 년이상 입출금거래가 없는 계좌"
        ],
        "source_chunk_ids": [
            "doc_3-chunk_18"
        ]
    },
    {
        "question": "만약 년 이상 입출금거래가 없는 계좌가 3 개 이상이라면, 그 계좌는 거래중지 계좌인가?",
        "answer": "아니요",
        "question_type": "Conditional QA",
        "context": [
            "2 원이상 원미만이며 년이상 입출금거래가 없는 계좌 (3) 예금잔액이 50,000 100,000 , 3 원이상 원미만이며 년이상 입출금거래가 없는 계좌※ 단 사고등록계좌 자동이체계좌 집합투자증권 , , , 연결계좌 및 비대면채널을 통한 근거계좌는 거래중지계좌"
        ],
        "source_chunk_ids": [
            "doc_3-chunk_19"
        ]
    },
    {
        "question": "금융 거래 목적을 확인 받았을 때, 거래를 다시 시작할 수 있는가?",
        "answer": "가능하다.",
        "question_type": "Conditional QA",
        "context": [
            "연결계좌 및 비대면채널을 통한 근거계좌는 거래중지계좌 편입대상에서 제외; 거래를 다시 시작하고자 하는 경우에는 본인 확인 및 금융거래 목적을 확인한 후 가능"
        ],
        "source_chunk_ids": [
            "doc_3-chunk_20"
        ]
    },
    {
        "question": "5년 이내에 계좌를 해지하지 않는다면, 휴면예금으로 어떻게 처리될까?",
        "answer": "서민금융진흥원(1397)에 출연될 수 있다.",
        "question_type": "Conditional QA",
        "context": [
            "휴면예금 및 출연- 이자지급을 포함한 최종거래일 이후 5년 이내 계좌를 해지하지 않을 경우 예금거래기본약관 제 조의 휴면예금 9 2 및 출연에 따라 휴면예금은 “서민금융진흥원( 1397)” 국번없이 에 출연될 수 있으며 이, 경우 서민금융진흥원을 통해 휴면예금을 찾으실"
        ],
        "source_chunk_ids": [
            "doc_4-chunk_21"
        ]
    },
    {
        "question": "만약 서민금융진흥원에서 휴면예금을 찾는 데 1년 이내에 성공한다면, 어떻게 되는가?",
        "answer": "휴면예금을 찾을 수 있습니다.",
        "question_type": "Conditional QA",
        "context": [
            "이, 경우 서민금융진흥원을 통해 휴면예금을 찾으실 수 있습니다"
        ],
        "source_chunk_ids": [
            "doc_4-chunk_22"
        ]
    },
    {
        "question": "만약 1년 동안 예금이 거래가 없는 상태라면, 휴면예금통합조회서비스를 통해 어떤 처리가 이루어지나요?",
        "answer": "휴면예금통합조회서비스를 통해 예금이 휴면처리되어 관리가 중단됩니다.",
        "question_type": "Conditional QA",
        "context": [
            ".- 휴면예금은 휴면예금통합조회서비스를 확인해주세요."
        ],
        "source_chunk_ids": [
            "doc_4-chunk_23"
        ]
    },
    {
        "question": "피보험자가 제3조(보험금의 지급사유)에 정한 위험이 발생하지 않으면, 보험회사에서 어떻게 되는가?",
        "answer": "보험금을 지급하지 않는다.",
        "question_type": "Conditional QA",
        "context": [
            "제1관 목적 및 용어의 정의제1조 (목적)① 이 보험계약(이하 ‘계약’이라 합니다)은 보험계약자(이하 ‘계약자’라 합니다)와 보험회사(이하 ‘회사’라 합니다) 사이에 제3조(보험금의 지급사유)에서 정한 피보험자의 위험을 보장하기 위하여 체결됩니다"
        ],
        "source_chunk_ids": [
            "doc_5-chunk_24"
        ]
    },
    {
        "question": "만약 보장계약과 연금계약이 이 계약으로 구성되어 있다면, 용어의 정의는 어디에 있는가?",
        "answer": "제2조",
        "question_type": "Conditional QA",
        "context": [
            ".② 이 계약은 제2조(용어의 정의)에서 정한 보장계약과 연금계약으로 구성됩니다"
        ],
        "source_chunk_ids": [
            "doc_5-chunk_25"
        ]
    },
    {
        "question": "계약해당일 이후 1개월이 지난 후에, 계약자적립액을 인출할 수 있는 최초의 연금개시전 보험기간의 연도가 몇 년인가요?",
        "answer": "계약해당일 이후 1개월이 지난 후부터 연금개시전 보험기간 중에 연 12회에 한하여 계약자적립액을 인출할 수 있으므로, 최초의 연금개시전 보험기간은 1년입니다.",
        "question_type": "Conditional QA",
        "context": [
            ".제14조 (계약자적립액의 인출) ① 계약자는 계약해당일 이후 1개월이 지난 후부터 연금개시전 보험기간 중에 보험연도 기준 연 12회에 한하여 계약자적립액의 일부를 인출할 수 있으며, 1회에 인출할 수 있는 최고 한도는 인출 당시 해약환급금(보험계약 대출의 원금과"
        ],
        "source_chunk_ids": [
            "doc_5-chunk_26"
        ]
    },
    {
        "question": "만약 인출 당시 해약환급금이 1000원을 초과하면, 한도가 얼마까지 인출될 수 있는가?",
        "answer": "500원",
        "question_type": "Conditional QA",
        "context": [
            "한도는 인출 당시 해약환급금(보험계약 대출의 원금과 이자를 차감한 금액)의 50%를 초과할 수 없습니다"
        ],
        "source_chunk_ids": [
            "doc_5-chunk_27"
        ]
    },
    {
        "question": "만약 10년이 지난 특약이 있다면, 계약해당일부터 10년이 지난 특약의 총 인출금액은 얼마까지 가능할까요?",
        "answer": "계약자가 실제 납입한 보험료 총액을 초과할 수 없습니다.",
        "question_type": "Conditional QA",
        "context": [
            ". 또한, 계약해당일부터 10년이 지나지 않은 특약의 총 인출금액은 계약자가 실제 납입한 보험료 총액을 초과할 수 없습니다."
        ],
        "source_chunk_ids": [
            "doc_5-chunk_28"
        ]
    },
    {
        "question": "만약 채무자가 채무를 상환하지 못하면, 양도담보권설정자는 어떻게 되는가?",
        "answer": "양도담보권설정자는 채무자가 채무를 상환하지 못하면, 채권자에게 양도담보권을 반환하여 소유권을 회수해야 한다.",
        "question_type": "Conditional QA",
        "context": [
            "양도담보계약서담보제공자 양도담보권설정자 가 꼭 알아두어야 할 사항양도담보란 담보로 제공한 물건의 소유권을 채권자에게 이전하고 기일에 채무자가 채무를 상환하게 되면 그소유권을 다시 회복하기로 하는 담보제도입니다"
        ],
        "source_chunk_ids": [
            "doc_6-chunk_29"
        ]
    },
    {
        "question": "자기소유의 원재료ㆍ제품 기계ㆍ기구 등에 양도담보권을 설정한다면, 타인의 채무불이행으로 인하여 자기재산을 빼앗기게 될 수 있는 위험을 부담하는 행위로 간주될 수 있는가?",
        "answer": "네",
        "question_type": "Conditional QA",
        "context": [
            ".따라서 자기소유의 원재료ㆍ제품 기계ㆍ기구 등에 양도담보권을 설정하는 경우 타인의 채무불이행으로 인하여 자기재산을 빼앗기게 될 수 있는 위험을 부담하는 행위입니다"
        ],
        "source_chunk_ids": [
            "doc_6-chunk_30"
        ]
    },
    {
        "question": "만약 회원의 잔여 M포인트 유효기간이 1년이라면, 탈퇴 회원이 재가입하여 카드 사용을 정상으로 하게 되면 잔여 M포인트는 어떻게 되는가?",
        "answer": "해당 잔여 M포인트도 유효",
        "question_type": "Conditional QA",
        "context": [
            "탈퇴 회원회원의 요청에 의한 해지·정지·탈회 및 신용카드 자격의 조건 변경에 따른 탈퇴 회원의 경우, 회원의 잔여 M포인트 사용은 제한되나, 잔여 M포인트는 유효기간 동안 유지됨잔여 M포인트 유효기간 내 회원이 재가입하여 카드 사용이 정상일 때, 해당 잔여 M포인트도"
        ],
        "source_chunk_ids": [
            "doc_7-chunk_31"
        ]
    },
    {
        "question": "만약 카드 사용이 정상일 때, M포인트 잔여한도가 5만 원 미만일 때, 해당 잔여 M포인트도 사용 가능할까요?",
        "answer": "불가능",
        "question_type": "Conditional QA",
        "context": [
            "카드 사용이 정상일 때, 해당 잔여 M포인트도 사용 가능"
        ],
        "source_chunk_ids": [
            "doc_7-chunk_32"
        ]
    },
    {
        "question": "만약 원재료 구입을 위해 기업대출을 받는다면, 자금용도별 구분은 어떤 것들이 있나요?",
        "answer": "운영자금 대출",
        "question_type": "Conditional QA",
        "context": [
            "Q1. 기업대출의 자금용도별 구분은 어떻게 되나요?1. 운영자금 대출 -원재료 구입, 종업원 급여·상여금-차입금 상환자금 등2"
        ],
        "source_chunk_ids": [
            "doc_8-chunk_33"
        ]
    },
    {
        "question": "만약 기계 장치의 자가제작을 위해서는, 최대 얼마까지의 자금을 대출받을 수 있는가?",
        "answer": "자가제작자금",
        "question_type": "Conditional QA",
        "context": [
            ".시설자금대출-시설의 신축, 증축 및 개·보수 자금-공장 등 업무용시설(부지 포함) 매입자금·임차보증금 등-회사 인수자금(회사 인수를 위한 지분인수, 자산·부채 인수, 합병 등)-기계장치의 구입, 설치, 자가제작자금"
        ],
        "source_chunk_ids": [
            "doc_8-chunk_34"
        ]
    },
    {
        "question": "만약 예금자보호법에 따라 보호되는 보호상품의 합산 한도가 1인당 5천만원 이라면, ················ Nice 정기예금의 보호 한도는 얼마인가요?",
        "answer": "5천만원",
        "question_type": "Conditional QA",
        "context": [
            "상품명 : ················ Nice 정기예금- dc/irp : 이 퇴직연금은 예금자보호법에 따라 예금보호 대상금융상품으로 운용되는 적립금에 대하여 다른 보호상품과는 별도로 ( 1인당 5천만원까지 운용되는 금융상품 판매회사별 보호상품 합산) . 보호됩니다"
        ],
        "source_chunk_ids": [
            "doc_9-chunk_35"
        ]
    },
    {
        "question": "만약 이 퇴직연금에 대한 예금자보호가 제공되지 않는다면, 어떤 위험을 부담해야 하나요?",
        "answer": "예금자보호법에 따라 보호되지 않기 때문에 예금자 본인 또는 후계자가 담보 또는 손실의 책임을 부담해야 합니다.",
        "question_type": "Conditional QA",
        "context": [
            "상품명 : ················ Nice 정기예금- db : 이 퇴직연금은 예금자보호법에 따라 보호되지 않습니다"
        ],
        "source_chunk_ids": [
            "doc_10-chunk_36"
        ]
    }
]
This post is licensed under CC BY 4.0 by the author.