
먼저 이번 실습에서 사용할 CSV 파일을 만듭니다.
아래 내용을 복사하여 llm_price.csv 라는 이름으로 저장해주세요.
⚠️ 주의: 아래 요금 정보는 예시용 모의 데이터입니다. 실제 서비스 요금은 각 플랫폼 공식 사이트에서 확인하세요.
명칭,개발사,강점,월정액 요금(달러),연간 요금(달러)
ChatGPT,OpenAI,자연스러운 대화 능력,25,300
Gemini,Google,고도의 추론 능력,19,228
Claude,Anthropic,장문 출력 능력,20,200
💡 저장 팁 (Windows 사용자)
메모장으로 저장할 경우, 반드시 인코딩을 UTF-8로 선택하세요.
한글 깨짐이 발생하면encoding='utf-8-sig'옵션을 사용해보세요(엑셀 호환 UTF-8).
이 CSV 파일에는 AI 챗봇의 명칭, 개발사, 강점, 월정액 요금, 연간 요금이 담겨 있습니다.
이것을 Python으로 읽어들여 AI에게 분석을 시키고, Streamlit으로 브라우저에 보기 좋게 표시하는 코드를 작성해나가겠습니다.
아래 코드를 llm_chat_v2.py 라는 이름으로 저장하세요.
파일명을 통일해두면 나중에 관리가 편리합니다.
import os
import pandas as pd
from langchain_google_genai import ChatGoogleGenerativeAI
import streamlit as st
from dotenv import load_dotenv
# .env 파일에서 API 키를 읽어들인다
load_dotenv()
# API 키를 환경변수에서 가져온다
google_api_key = os.getenv('GOOGLE_API_KEY')
# Gemini API 클라이언트 초기화
gemini = ChatGoogleGenerativeAI(
model = "gemini-2.5-flash",
google_api_key = google_api_key
)
# CSV 파일을 읽어들인다
data = pd.read_csv('llm_price.csv')
# CSV의 내용을 문자열로 변환
csv_content = data.to_csv(index=False)
# prompt(AI에 대한 질문)를 정의
prompt = f"다음 CSV 데이터를 분석하여, AI 챗봇 요금 플랜의 경향을 알려주세요.\n\n{csv_content}"
# Gemini에 질문하여 답변을 가져온다
response = gemini.invoke(prompt)
# CSV 데이터와 AI의 답변을 콘솔에 표시
print("=== CSV 데이터:\n")
print(csv_content)
print("=== AI의 답변:\n")
print(response.content)
# CSV 데이터와 AI의 답변을 브라우저에 표시
st.markdown("### CSV 데이터")
st.dataframe(data)
st.markdown("---")
st.markdown("### AI의 답변")
st.markdown(response.content)
# 기동 명령어:
# streamlit run llm_chat_v2.py
# 종료:
# Ctrl + C
llm_price.csv와 llm_chat_v2.py가 같은 폴더에 있는가?.env 파일에 GOOGLE_API_KEY=...가 저장되어 있는가?pip install langchain-google-genai streamlit python-dotenv pandas가 완료되어 있는가?streamlit run llm_chat_v2.py
실행하면 브라우저가 자동으로 열리며, CSV 표와 AI의 분석 결과가 나란히 표시됩니다.
종료는 터미널에서 Ctrl + C를 누르세요.
| 오류 메시지 | 원인 | 해결 방법 |
|---|---|---|
FileNotFoundError: llm_price.csv | CSV 파일 위치가 다름 | 스크립트와 같은 폴더에 CSV가 있는지 확인 |
UnicodeDecodeError | 파일 인코딩 불일치 | pd.read_csv('llm_price.csv', encoding='utf-8-sig') 시도 |
ParserError | CSV 형식 오류 | 쉼표(,) 구분이 올바른지, 따옴표가 짝이 맞는지 확인 |
KeyError | 컬럼 이름 불일치 | CSV 헤더 이름과 코드에서 참조하는 이름이 일치하는지 확인 |
pd.read_csv('llm_price.csv') 부분의 파일 이름만 바꾸면, 어떤 CSV든 AI에게 분석시킬 수 있습니다.
실전 활용 예시 (국내 환경):
# 카카오 애널리틱스에서 내보낸 데이터
data = pd.read_csv('kakao_traffic.csv', encoding='utf-8-sig')
# 네이버 쇼핑 상품 비교 데이터
data = pd.read_csv('naver_shopping.csv', encoding='utf-8-sig')
# Google 스프레드시트 → CSV로 다운로드한 월별 매출 데이터
data = pd.read_csv('monthly_sales.csv', encoding='utf-8-sig')
Google 스프레드시트라면 파일 → 다운로드 → CSV(.csv) 로 내보낸 뒤, 같은 폴더에 두고 파일 이름만 맞춰주면 바로 사용할 수 있습니다.
💡 포인트
import streamlit as st가 포함된 파일은 반드시streamlit run 파일명.py로 실행한다.- Streamlit 앱은
Ctrl + C로 종료한다.
먼저 제0부·제1부의 내용을 간략히 복습한 뒤, 이번 새로 등장한 개념을 해설합니다.
| 코드 패턴 | 역할 |
|---|---|
import 문 | 필요한 라이브러리를 불러온다 |
load_dotenv() + os.getenv(...) | .env에서 API 키를 읽어온다 |
ChatGoogleGenerativeAI(...) | 클래스(설계도)에서 인스턴스(실체)를 초기화 |
gemini.invoke(prompt) | AI에게 질문을 던지고 답변을 받는다 |
response.content | AI 답변의 순수한 텍스트를 꺼낸다 |
st.markdown(...) | 브라우저에 Markdown 형식으로 표시 |
streamlit run 파일명.py | Streamlit 앱을 브라우저에서 기동 |
data란 무엇인가 — DataFrame(데이터프레임) 이해하기data = pd.read_csv('llm_price.csv')
csv_content = data.to_csv(index=False)
st.dataframe(data)
이 코드에서 data라는 변수가 세 번 등장합니다.
pd.read_csv()로 CSV 파일을 읽어들이면, data에는 "DataFrame(데이터프레임)" 이라는 특별한 형식이 저장됩니다.
DataFrame은 pandas 라이브러리가 제공하는 "표(Table)"를 다루기 위한 형식입니다. Python 표준 기능은 아니지만, 너무나 강력한 나머지 "사실상의 표준" 으로 자리잡았습니다.
직관적으로 이해하는 DataFrame:
| 도구 | 내보내기 방법 | 결과 |
|---|---|---|
| Excel | "CSV로 저장" | .csv 파일 |
| Google 스프레드시트 | "CSV로 다운로드" | .csv 파일 |
| DataFrame | to_csv() | CSV 형식의 문자열 |
즉 DataFrame은 Python 안에서 살아있는 "표"이고, 필요에 따라 CSV·Excel·HTML 등 다양한 형식으로 내보낼 수 있습니다.
data.to_csv(index=False) # CSV 문자열로 변환
data.to_excel('output.xlsx') # 엑셀 파일로 저장
data.to_html() # HTML 표로 변환
index=False에 대하여
DataFrame은 CSV를 읽어들일 때 자동으로 행 번호(0, 1, 2...)를 붙입니다.
index=False는 이 행 번호를 CSV에 포함하지 않도록 하는 옵션입니다.
지금은 "그렇게 쓰면 깔끔하게 나온다" 정도로 기억해두면 충분합니다.
Streamlit이 DataFrame을 기본 지원하는 이유:
st.dataframe(data) # 이것만으로 브라우저에 표가 표시된다
st.dataframe()이 단 한 줄로 동작하는 것은, DataFrame이 Python 생태계에서 워낙 광범위하게 쓰이기 때문입니다. Streamlit이 DataFrame을 "알아보고" 자동으로 표 형식으로 렌더링해줍니다.
만약 DataFrame 없이 CSV 내용을 직접 브라우저에 표 형식으로 표시하려면, 수십 줄의 코드가 필요합니다.
💡 포인트: DataFrame의 다양성
이번에 CSV로 변환한 이유는, AI(Gemini)가 CSV 텍스트를 잘 이해하기 때문입니다.
DataFrame →to_csv()→ 문자열 →prompt에 삽입 → AI 분석
이 흐름이 "AI에게 데이터를 전달하는 기본 패턴"입니다.
prompt = f"다음 CSV 데이터를 분석하여, AI 챗봇 요금 플랜의 경향을 알려주세요.\n\n{csv_content}"
문자열을 ""로 감싸는 것은 Python의 기본 문법입니다.
문자열 앞에 f를 붙이면 f-string이 됩니다. {} 안에 변수를 쓰면 그 값이 문자열 안에 자동으로 삽입됩니다.
# 일반 문자열
greeting = "안녕하세요, 사용자님."
# f-string: 변수의 값을 삽입
name = "김민준"
greeting = f"안녕하세요, {name}님."
print(greeting) # 안녕하세요, 김민준님.
\n — 줄바꿈 문자:
\n은 줄바꿈을 의미하는 이스케이프 시퀀스입니다. 문자열 안에서 Enter를 친 것과 같은 효과를 냅니다.
csv_content = "apple, banana, cherry\n 10, 20, 30"
prompt = f"CSV 데이터: \n{csv_content}"
print(prompt)
# 출력 결과:
# CSV 데이터:
# apple, banana, cherry
# 10, 20, 30
f-string의 실용적인 활용 패턴:
# 분석 대상을 유연하게 바꿀 수 있다
target = "월별 매출 데이터"
language = "한국어"
prompt = f"다음 {target}를 분석하여, 결과를 {language}로 알려주세요.\n\n{csv_content}"
# 숫자 포맷도 가능
price = 25000
print(f"가격: {price:,}원") # 가격: 25,000원
print(f"할인율: {0.15:.1%}") # 할인율: 15.0%
⚠️ f-string과
\n은 이후 코드에서 계속 등장합니다. 지금 바로 외울 필요는 없지만, 자주 접하다 보면 자연스럽게 손에 익습니다.
형식별 텍스트 편집기 가독성 정리:
| 형식 | 텍스트 편집기로 열기 | AI 전달 가능 여부 |
|---|---|---|
| DataFrame | ❌ (내부 메모리 형식) | ❌ 직접 전달 불가 |
| Excel (.xlsx) | ❌ (바이너리 형식) | ❌ 직접 전달 불가 |
| CSV | ✅ (텍스트 형식) | ✅ 가능 |
| Markdown | ✅ (텍스트 형식) | ✅ 가능 |
DataFrame을 AI에게 넘기려면, 반드시 to_csv()로 텍스트 형식으로 변환해야 합니다. 이것이 csv_content = data.to_csv(index=False) 한 줄의 역할입니다.
st.markdown("### CSV 데이터")
st.markdown("---")
st.markdown("### AI의 답변")
st.markdown(response.content)
###, --- 같은 기호가 섞인 문자열을 Markdown(마크다운) 형식이라고 합니다.
Markdown은 텍스트를 꾸미기 위한 경량 마크업 언어입니다.
CSV가 ,(쉼표)로 구분된 텍스트에 불과하듯, Markdown도 #, -, * 등의 기호를 사용한 일반 텍스트 파일입니다.
Streamlit 외에도 다음 도구들이 Markdown을 지원합니다.
.md 파일을 미리보기로 렌더링| 기호 | 의미 | 렌더링 결과 |
|---|---|---|
# | 제목 레벨1 | 가장 큰 제목 |
## | 제목 레벨2 | 중간 제목 |
### | 제목 레벨3 | 소제목 |
- 또는 * | 글머리 기호 목록 | • 항목 |
1. | 번호 목록 | 1. 항목 |
**text** | 굵은 글씨 | 굵게 |
*text* | 기울임꼴 | 기울임 |
--- | 수평선 | ─────── |
`code` | 인라인 코드 | 코드 |
```code``` | 코드 블록 | 코드 박스 |
왜 AI 응답이 Markdown 형식인가?
Gemini를 비롯한 대부분의 AI는 기본적으로 Markdown 형식으로 답변을 생성합니다.
그래서 st.markdown(response.content)를 쓰면, AI가 만든 제목·목록·굵은 글씨 등이 브라우저에서 그대로 깔끔하게 렌더링됩니다.
반면 st.text(response.content) 또는 print(response.content)를 쓰면, ###이나 ** 같은 기호가 그대로 노출됩니다.
Markdown 직접 시험해보기
StackEdit에 접속하여 "START WRITING"을 클릭하면, 왼쪽에 Markdown을 입력하고 오른쪽에서 렌더링 결과를 바로 확인할 수 있습니다.
이 교과서도 전부 Markdown으로 작성되었습니다.
이번 챕터에서 작성한 코드의 데이터 흐름을 정리하면 다음과 같습니다.
llm_price.csv (파일)
↓ pd.read_csv()
data (DataFrame — Python 안의 "표")
↓ data.to_csv(index=False)
csv_content (문자열 — AI에게 전달 가능한 형태)
↓ f-string으로 prompt에 삽입
prompt (질문 문자열)
↓ gemini.invoke(prompt)
response (AI 답변 객체)
↓ response.content
AI 답변 텍스트 (Markdown 형식)
↓ st.markdown()
브라우저에 렌더링
이 흐름은 앞으로 어떤 CSV 데이터를 분석할 때도 그대로 재사용할 수 있는 기본 패턴입니다.
제2부에서 배운 핵심 개념을 정리합니다.
| 개념 | 한 줄 요약 |
|---|---|
| DataFrame | pandas가 제공하는 Python 안의 "표". CSV·Excel·HTML로 변환 가능 |
to_csv(index=False) | DataFrame을 AI에게 전달할 수 있는 CSV 문자열로 변환 |
st.dataframe(data) | DataFrame을 브라우저에 표 형식으로 표시 |
| f-string | f"...{변수}..." 형식으로 문자열 안에 변수 값을 삽입 |
\n | 문자열 안에서 줄바꿈을 나타내는 이스케이프 시퀀스 |
| Markdown | #, -, ** 등의 기호로 텍스트를 꾸미는 경량 마크업 언어 |
©2024-2026 MDRULES.dev, Hand-crafted & made with Jaewoo Kim.
이메일문의: jaewoo@mdrules.dev
AI강의/개발/기술자문, AI 업무 자동화 컨설팅 문의: https://talk.naver.com/ct/w5umt5
AI 프롬프트 및 워크플로우 설계 대행: https://mdrules.dev
📚 다음 단계 — 제3부로: try-except 구문, if문, for문, 리스트, 딕셔너리, 함수, 클래스 등 Python의 핵심 기본 문법을 배우면서, AI 운세 앱·공공 데이터 분석 앱 등 더 복잡한 실용 프로젝트를 만들어 나갑니다.