02
문자열을 자른다 — 슬라이싱과 반복문
#AI가 문서를 읽으려면 먼저 문서를 잘라야 한다. 파이썬의 문자열 슬라이싱으로 긴 글을 조각내고, 그 과정에서 반드시 만나는 함정 하나를 직접 눈으로 확인한다.
AI 서비스를 만든다고 하면 보통 모델부터 떠올린다. 그런데 문서를 다루는 AI 서비스가 가장 먼저 하는 일은 모델과 아무 상관이 없다. 긴 문서를 짧은 조각으로 자르는 것이다.
왜 자르나
#모델에게 문서를 통째로 넘길 수는 없다. 넣을 수 있는 글자 수에 한계가 있어서다. 한계가 없다 해도 통째로 넣으면 안 된다. 질문이 「연차 이월」인데 회사 규정 50장을 전부 넘기면, 모델은 그 안에서 답을 찾느라 헤매고 비용도 50장어치가 나간다.

첫 칸이 무너지면 나머지가 다 무너진다. 조각이 엉뚱하게 잘리면 그 뒤로 아무리 좋은 모델을 써도 답이 안 나온다.
슬라이싱 — 여러 글자를 한 번에 꺼낸다
글자 하나가 아니라 구간을 꺼내는 것을 슬라이싱이라고 한다. 대괄호 안에 콜론을 넣고 시작과 끝을 적는다.
text = "백엔드 개발자는 서버와 데이터베이스를 다룬다. 사용자 눈에 보이지 않는 곳에서 데이터를 저장하고 꺼내는 일을 한다. 주로 쓰는 언어는 자바, 파이썬, 노드다. 요즘은 클라우드 지식도 함께 요구된다."
# 대괄호 안에 콜론(:)을 넣으면 하나가 아니라 구간을 꺼낸다.
# 왼쪽이 시작, 오른쪽이 끝이다. 끝 번호는 포함되지 않는다 - 0~19번까지다.
print(text[0:20])
print(text[:20]) # 시작을 비우면 "처음부터". 위와 같다
print(text[90:]) # 끝을 비우면 "끝까지". 몇 글자인지 몰라도 된다
# 끝 번호가 실제 길이(110)를 한참 넘어도 에러가 안 난다. 있는 만큼만 준다
print(text[90:9999])


문서를 30글자씩 자른다
이제 본론이다. 110글자짜리 문서를 30글자씩 잘라본다. 손으로 하면 text[0:30], text[30:60], text[60:90], text[90:120] 네 줄이다. 그런데 문서가 5,000글자면 이 짓을 167번 해야 한다. 그래서 반복문을 쓴다.
text = "백엔드 개발자는 서버와 데이터베이스를 다룬다. 사용자 눈에 보이지 않는 곳에서 데이터를 저장하고 꺼내는 일을 한다. 주로 쓰는 언어는 자바, 파이썬, 노드다. 요즘은 클라우드 지식도 함께 요구된다."
# range(시작, 끝, 건너뛰기) 는 숫자를 차례로 만들어 주는 도구다.
# range(0, 110, 30) -> 0, 30, 60, 90
# 110 은 "여기까지"가 아니라 "여기 전까지"다. 슬라이싱과 같은 규칙이다.
#
# for A in B: 는 "B 에서 하나씩 꺼내 A 에 넣고, 아래 줄을 반복하라"는 뜻이다.
for start in range(0, len(text), 30):
# 이 줄 앞의 공백 4칸이 "이 줄은 for 안쪽"이라는 표시다. 문법이다.
# start 가 0 이면 text[0:30]
# start 가 30 이면 text[30:60]
# 앞 조각의 끝과 다음 조각의 시작이 같은 숫자라 겹치지도 빠지지도 않는다.
print(text[start:start + 30])

네 조각이 나왔다. range(0, 110, 30) 이 0, 30, 60, 90 네 개를 만들었고, 마지막 text[90:120] 은 110에서 끊겨 20글자만 나왔다.

문단으로 자르기 — split()
문장 끝에 마침표가 있으니, 마침표를 기준으로 자르면 문장이 안 찢어진다. split() 이 그 일을 한다.
text = "백엔드 개발자는 서버와 데이터베이스를 다룬다. 사용자 눈에 보이지 않는 곳에서 데이터를 저장하고 꺼내는 일을 한다. 주로 쓰는 언어는 자바, 파이썬, 노드다. 요즘은 클라우드 지식도 함께 요구된다."
# text.split(x) 는 "text 를 x 가 나올 때마다 잘라 리스트로 만들라"는 뜻이다.
# 점(.)을 붙여 부르는 것은 "이 문자열에게 시키는 일"이라는 표시다.
# 기준을 ". " (마침표 + 공백)로 준 이유는 문장이 그렇게 끝나기 때문이다.
parts = text.split(". ")
print(parts)
print(len(parts)) # 리스트에 쓰면 "항목이 몇 개인가". 문자열일 때는 글자 수였다
print(parts[0]) # 리스트도 대괄호로 꺼낸다. 0번이 첫 항목인 것도 같다
print(parts[:2]) # 리스트도 콜론으로 구간을 꺼낸다. 0번과 1번, 두 개다

대괄호로 감싸인 이것이 리스트다. 문자열 여러 개를 순서대로 담아둔 상자다. 이번엔 문장이 하나도 안 찢어졌다.
셋째 줄과 넷째 줄을 비교해보면 차이가 보인다. 항목 하나를 찍으면 따옴표가 없고, 리스트째 찍으면 따옴표가 붙는다. 파이썬이 「이 안의 것들은 문자열이다」를 표시해주는 것이다.
리스트도 문자열처럼 0번부터 번호가 붙고, 슬라이싱도 똑같이 된다. 문자열은 글자를 담은 줄이고 리스트는 아무거나 담은 줄인데, 다루는 방식이 같다.

조각에 번호를 붙여 보기 좋게 찍는다
조각이 여러 개면 몇 번째인지 알아야 한다. enumerate() 를 쓰면 번호와 값을 같이 준다.
text = "백엔드 개발자는 서버와 데이터베이스를 다룬다. 사용자 눈에 보이지 않는 곳에서 데이터를 저장하고 꺼내는 일을 한다. 주로 쓰는 언어는 자바, 파이썬, 노드다. 요즘은 클라우드 지식도 함께 요구된다."
parts = text.split(". ")
# enumerate(리스트) 는 "번호와 값을 짝지어" 내놓는다.
# 그래서 받는 이름도 두 개다 - i 에 번호, part 에 값이 들어간다.
for i, part in enumerate(parts):
print(i, part) # print 에 값을 여럿 주면 공백으로 이어 찍는다
print("---")
for i, part in enumerate(parts):
# 따옴표 앞의 f 는 "이 문자열 안의 중괄호를 값으로 바꿔라"는 표시다.
# {i + 1} 번호가 0부터라 1을 더해 사람이 세는 대로 만든다
# {len(part)} 중괄호 안에서는 계산도 함수 호출도 된다
print(f"{i + 1}번 조각 ({len(part)}글자) : {part}")

f-string 은 문자열 안에서 계산까지 된다. {i + 1} 처럼 식을 그냥 넣으면 결과가 들어간다. 길이를 같이 찍어두면 조각이 고른지 한눈에 보인다 — 24, 37, 22, 21 로 하나가 유독 길다.

정리하면
문자열은 번호가 붙은 글자의 줄이고, 슬라이싱으로 구간을 꺼낸다. 반복문과 합치면 긴 문서를 일정한 크기로 자를 수 있다. 다만 글자 수로만 자르면 문장이 찢어지고, 그래서 문단 단위 자르기와 오버랩이 필요해진다.
이 문제를 눈으로 확인한 것이 이번 강의의 핵심이다. 다음 강의에서는 조각을 담아둔 리스트를 함수로 다루고, 점수를 매겨 상위 3개만 뽑는 법을 배운다. 검색의 마지막 단계다.
'AI' 카테고리의 다른 글
| 0810 디코드랩 정리(AI Engineering 06) (0) | 2026.08.11 |
|---|---|
| 0810 디코드랩 정리(AI Engineering 05) (0) | 2026.08.11 |
| 0810 디코드랩 정리(AI Engineering 04) (0) | 2026.08.10 |
| 0810 디코드랩 정리(AI Engineering 03) (0) | 2026.08.10 |
| 0810 디코드랩 정리(AI Engineering 01) (0) | 2026.08.10 |