준비 확인
시작하기 전에 아래 항목을 확인해 주세요. 이후 단계의 안내는 윈도우 기준입니다. 체크한 내용은 이 브라우저에만 저장됩니다.
| DATA 폴더의 파일 | 내용 |
|---|---|
| 2024년 9장 공무원여비업무 처리기준.pdf | 여비 지급 기준과 처리 절차 (102쪽) |
| 공무원여비100문100답.pdf | 자주 묻는 사례와 답 (52쪽) |
- AI 코딩 도구의 구독과 OpenAI API 키는 별개입니다. 우리가 만드는 챗봇이 임베딩과 답변을 만들 때 API 키를 씁니다.
- API 키는 채팅창이나 코드에 붙여 넣지 않습니다.
.env파일에만 넣습니다.
uv가 설치되어 있지 않다면
uv는 파이썬과 패키지를 대신 설치하고 관리해 주는 도구입니다. 파이썬을 따로 설치하지 않아도 됩니다. 공식 설치 안내는 https://docs.astral.sh/uv/getting-started/installation/에 있습니다.
- 내 컴퓨터에 맞는 설치 명령을 붙여 넣어 실행합니다.
- 설치가 끝나면 창을 닫고 새로 엽니다. 새로 열어야
uv명령을 찾습니다. - 확인 명령을 실행해 버전 번호가 나오면 설치된 것입니다.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
curl -LsSf https://astral.sh/uv/install.sh | sh
uv --version
- PowerShell이나 터미널을 닫았다가 새로 열었는지 확인합니다. AI 코딩 도구도 켜져 있었다면 껐다가 다시 켭니다.
완성본 보기
만들기 전에 완성된 챗봇을 직접 써 보고 오늘 만들 범위를 확인합니다.
| 완성본 | https://ragchatbot9.streamlit.app/ 오늘 만들 챗봇의 완성된 모습입니다. 한동안 접속이 없었다면 깨어나는 데 1분쯤 걸릴 수 있습니다. |
이렇게 써 보세요
- "친지 집에 숙박했을 때 숙박비는?"이라고 물어봅니다.
- 답변 아래의 출처를 봅니다. 어느 파일의 몇 쪽에서 어떤 문장을 근거로 삼았는지 나옵니다.
- "민간기업 직원 출장비 기준도 알려주세요."처럼 문서에 없는 내용을 물어봅니다.
- 답변마다 출처 파일명과 근거 문장이 붙어 있나요?
- 문서에 없는 내용을 물었을 때 지어내지 않고 범위를 안내하나요?
- ChatGPT에 같은 질문을 했을 때와 무엇이 다른가요?
전체 흐름 보기
오늘 만드는 것은 질문을 받으면 문서에서 근거를 찾아 답하는 서비스입니다. 다섯 단계로 진행합니다.
| 단계 | 하는 일 |
|---|---|
| 1. 프로젝트 설정 | uv init으로 초기화, 패키지 설치, 환경 변수 설정 |
| 2. 챗봇 개발 | 실습 데이터 준비, 챗봇 코드 작성, 로컬 실행과 반복 수정 |
| 3. 배포 준비 | Git 설치, GitHub 저장소 생성, .gitignore 설정 |
| 4. GitHub 업로드 | 저장소 연결, git add · commit, git push |
| 5. 배포 | Streamlit Cloud 연결, 저장소 선택, 배포와 동작 확인 |
도구가 맡는 역할
- 내 컴퓨터편집기app.py를 작성하고 터미널에서 실행
- 내 컴퓨터uv파이썬 환경과 패키지 관리
- 내 컴퓨터Git변경 이력을 내 컴퓨터에 기록
- 인터넷GitHub프로젝트를 인터넷 저장소에 보관
- 인터넷Streamlit CloudGitHub의 코드를 가져와 웹 앱으로 실행
코드 작성 → 환경 관리 → 버전 기록 → GitHub 업로드 → 웹 서비스 배포 순서입니다. 배포한 뒤에는 코드를 고치고 다시 push하면 배포판이 따라 바뀝니다.
챗봇 안에서 일어나는 일
- DATA 폴더의 문서를 읽어 작은 조각으로 나눕니다.
- 조각을 임베딩해 벡터DB에 넣습니다.
- 질문이 들어오면 뜻이 가까운 조각을 찾습니다.
- 찾은 조각만 근거로 답변 모델이 답합니다.
프로젝트 설정
빈 폴더를 파이썬 프로젝트로 만들고, 필요한 패키지를 설치하고, API 키를 넣을 자리를 만듭니다. 프롬프트를 하나씩 보내고 결과를 확인한 뒤 다음으로 넘어갑니다.
1. uv init으로 초기화
현재 폴더에서 uv init을 실행해 Python 프로젝트를 초기화해줘. Python 3.11을 사용해.
- 폴더에
pyproject.toml과.python-version이 생겼나요? .python-version안의 값이 3.11인가요?
2. 패키지 설치
RAG 챗봇 개발을 시작할 수 있도록 이 프로젝트의 기본 환경을 준비해줘. uv로 langchain, langchain-openai, langchain-text-splitters, streamlit, python-dotenv 최신 안정 버전을 설치하고, 실제 import 테스트 후 경고나 에러가 있으면 최신 방식으로 수정해줘.
pyproject.toml의 dependencies에 패키지 5개가 들어갔나요?uv.lock파일이 생겼나요? 설치한 버전을 고정해 두는 파일입니다.- AI가 import 테스트를 실제로 실행했다고 했나요, 아니면 될 것이라고만 했나요?
3. 환경 변수 설정
.env 파일을 만들어서 OpenAI API 키를 넣을 수 있게 해줘.
만들어진 .env를 메모장으로 열어 = 뒤에 키를 붙여 넣고 저장합니다. 따옴표와 공백은 넣지 않습니다.
OPENAI_API_KEY=sk-...
- 도구에 따라 보안상
.env파일은 직접 만들지 못하게 막혀 있습니다. 탐색기에서 새 텍스트 파일을 만들어 이름을.env로 바꾸고 위 한 줄을 넣으면 됩니다. - 이름 끝에
.txt가 붙지 않았는지 확인합니다. 탐색기의 보기 → 표시 → 파일 확장명을 켜면 보입니다.
챗봇 개발
DATA 폴더의 문서로 답하는 챗봇을 만듭니다. 조건을 구체적으로 적을수록 AI가 임의로 정하는 부분이 줄어듭니다.
1. 챗봇 코드 작성
DATA 폴더 안의 파일을 모두 읽어서 RAG 챗봇을 만들어줘. 조건: Python 3.11 기준 화면은 Streamlit OpenAI API 사용 API Key는 .env의 OPENAI_API_KEY에서 읽기 임베딩 모델: text-embedding-3-small 답변 모델: gpt-4o-mini 벡터DB: InMemoryVectorStore LangChain 최신 방식 사용 LLMChain, ConversationChain, RetrievalQA 같은 구버전 방식 금지 문서에 없는 내용은 추측하지 않기 답변 아래에 출처 파일명과 근거 문장 표시 초보자가 이해할 수 있게 한글 주석 작성 파일명은 app.py로 하고 프로젝트 최상단에 저장 코드 작성 후 실제로 실행해서 에러나 deprecated 경고가 없는지 확인하고, 있으면 고쳐줘.
| 조건 | 왜 적었나 |
|---|---|
| 모델 이름 두 가지 | 적지 않으면 AI가 더 비싸거나 오래된 모델을 고를 수 있습니다 |
| InMemoryVectorStore | 설치할 것이 없는 가장 단순한 벡터DB입니다. 앱을 끄면 사라지고, 켤 때 다시 만듭니다 |
| 구버전 방식 금지 | 인터넷에 옛 예제가 많아 AI가 따라 쓰기 쉽습니다 |
| 추측하지 않기, 출처 표시 | 규정을 다루는 챗봇은 근거를 확인할 수 있어야 합니다 |
| 실제로 실행해서 확인 | 작성만 하고 끝내지 않게 합니다 |
2. 실행하기
실행해줘
AI가 직접 실행하지 못하면 실행 파일을 만들어 달라고 합니다.
더블클릭하면 챗봇이 실행되는 run.bat 파일을 만들어줘.
파일 탐색기에서 run.bat을 더블클릭하면 검은 창이 뜨고 브라우저가 열립니다.
- 검은 창이 챗봇을 돌리고 있습니다. 닫으면 브라우저의 챗봇 화면도 멈춥니다.
- 챗봇을 쓰는 동안에는 계속 열어 두고, 다 썼을 때 닫습니다.
- 브라우저에 챗봇 화면이 열리나요?
- "친지 집에 숙박했을 때 숙박비는?"이라고 물으면 답과 함께 출처 파일명, 근거 문장이 나오나요?
- 근거 문장을 PDF에서 직접 찾아 한 건이라도 대조해 보세요.
3. 대화 유지와 초기화 버튼
대화 내용이 지워지지 않게 해줘. 지우고 싶을 때를 대비해 초기화 버튼을 만들어줘.
- 질문을 두 번 했을 때 첫 번째 질문과 답이 화면에 남아 있나요?
- 초기화 버튼을 누르면 대화가 비워지나요?
챗봇 테스트
AI가 완료했다고 해도 직접 확인하기 전에는 완료가 아닙니다. 쉬운 질문만 넣지 말고, 유형별로 하나씩 넣어 기대한 동작이 나오는지 봅니다.
| 유형 | 기대 동작 | 예시 질문 |
|---|---|---|
| 정상 · 단일 근거 | 정확한 답변과 근거 제시 | 근무지 외 국내출장 시 지급되는 여비 항목은 무엇인가요? |
| 조건형 · 복합 상황 | 여러 조건을 종합해 판단 | 서울 거주·세종 근무자가 서울에서 대구로 바로 출장 가면 운임은 어떻게 지급되나요? |
| 금액 · 계산형 | 계산 과정과 적용 기준 제시 | 제주 2박 3일 출장에서 숙박비가 5만2천 원, 4만7천 원이면 얼마를 받을 수 있나요? |
| 예외 · 경계 사례 | 원칙과 예외를 구분 | 기상 악화로 출장 기간이 하루 늘어난 경우 여비를 추가 지급할 수 있나요? |
| 정보 부족 질문 | 직급, 숙박 일수, 실제 지출액 등 필요한 조건을 되물음 | 제주 출장 숙박비는 얼마인가요? |
| 문서 외 · 답변 불가 | 자료 범위를 안내하고 추측하지 않음 | 민간기업 직원 출장비 기준도 알려주세요. |
| 오답 유도 · 허위 전제 | 잘못된 전제를 바로잡음 | 자가용 출장도 일비를 무조건 절반으로 깎나요? |
기대와 다른 답이 나왔다면
어떤 질문에 무엇이 나왔고 무엇이 나와야 하는지를 그대로 적어 보냅니다. 색칠된 부분을 내 내용으로 바꿉니다.
"[질문]"이라고 물었더니 [실제로 나온 답]이 나왔어. [기대한 답]이 나와야 해. 원인을 확인하고 고친 뒤, 같은 질문으로 다시 실행해서 결과를 보여줘.
- 일곱 유형 중 기대와 다르게 나온 것은 몇 개인가요?
- 하나를 고친 뒤, 앞에서 잘 되던 질문이 여전히 잘 되나요?
배포 준비
내 컴퓨터의 프로젝트를 인터넷에 올리려면 Git과 GitHub 저장소가 필요합니다.
1. Git 설치
- 검색창에 "GIT 설치"를 검색해 Git - Install for Windows를 엽니다. 주소는 git-scm.com/install/windows입니다.
- Git for Windows/x64 Setup을 내려받아 실행합니다.
- 설치 화면의 선택지는 기본값 그대로 두고 끝까지 진행합니다.
- PowerShell을 새로 열어 아래 명령으로 확인합니다.
git --version
2. GitHub 계정 만들기
- https://github.com/에 접속합니다.
- Sign up을 선택합니다.
- 이메일, 비밀번호, 사용자 이름을 입력합니다.
- 이메일 인증을 완료합니다.
GitHub 사용자 이름은 프로젝트 주소에도 쓰이므로 영문과 숫자로 된 간단한 이름을 권장합니다.
3. 새 저장소 만들기
- GitHub에 로그인합니다.
- 오른쪽 위의 +를 선택합니다.
- New repository를 선택합니다.
- Repository name에
chatbot을 입력하고 저장소를 만듭니다.
4. .gitignore 확인
.gitignore는 GitHub에 올리지 않을 파일을 적어 두는 목록입니다. API 키가 든 .env가 여기에 꼭 들어 있어야 합니다.
.gitignore에 .env와 .venv가 들어 있는지 확인하고, 없으면 추가해줘.
.gitignore를 열었을 때.env줄이 보이나요?
GitHub 업로드
내 컴퓨터의 프로젝트를 GitHub 저장소와 연결하고 올립니다. 올리기 전에 API 키가 빠져 있는지 반드시 확인합니다.
1. Git 작성자 정보 등록
Git을 처음 쓸 때 한 번만 합니다. 색칠된 부분을 내 이름과 GitHub 가입 이메일로 바꿉니다.
git config --global user.name "홍길동" git config --global user.email "내GitHub가입이메일"
2. 저장소 연결
- 방금 만든 저장소 화면에서 브라우저 주소창의 주소를 복사합니다.
- 복사한 주소를 아래 칸에 붙여 넣습니다. 명령에 주소가 자동으로 들어갑니다.
chatbot폴더에서 PowerShell을 열고, 명령을 복사해 실행합니다.
git init
git branch -M main
git remote add origin (위 칸에 저장소 주소를 넣으세요)저장소 화면 아래쪽 상자에 나오는 명령은 쓰지 않습니다. 파일을 올리는 일은 다음 프롬프트로 합니다.
3. 프로젝트 올리기
현재 프로젝트를 GitHub의 origin/main에 푸시해줘. 다만 .env와 API 키가 포함되지 않았는지 먼저 확인하고, 업로드 대상 파일 목록을 보여준 뒤 진행해줘.
처음 push할 때 브라우저에 GitHub 로그인 창이 뜨면 로그인합니다.
- 업로드 목록에
.env가 없나요? 가장 먼저 확인합니다. app.py,pyproject.toml,uv.lock,DATA폴더의 PDF가 목록에 있나요? 배포판이 이 파일들을 읽습니다.- 올린 뒤 GitHub 저장소 화면을 새로고침해 파일 목록을 직접 확인했나요?
4. 배포 환경에 맞게 준비
내 컴퓨터에서는 .env가 키를 주지만, 배포 서버에는 그 파일이 없습니다. 키를 읽는 방법을 배포 환경에 맞게 바꿉니다.
이 프로젝트를 Streamlit Cloud로 배포하려고 해. API 키는 GitHub에 올리지 않고 안전하게 설정하는 방법을 알려줘. 현재 코드에 수정이 필요하면 수정해줘.
- 고친 뒤에도 내 컴퓨터에서 챗봇이 그대로 실행되나요?
- 고친 코드가 GitHub에 올라갔나요? 올라가지 않았다면 3번 프롬프트를 다시 보냅니다.
Streamlit Cloud 배포
GitHub에 올린 챗봇을 주소 하나로 접속할 수 있게 만듭니다.
1. Streamlit Community Cloud 접속
- https://share.streamlit.io/에 접속합니다.
- Sign in을 선택합니다.
- GitHub 계정으로 로그인합니다.
- GitHub 연결 권한을 승인합니다.
2. 앱 생성
- Create app 또는 New app을 선택합니다.
- Deploy a public app from GitHub를 선택합니다.
- Repository에 내
chatbot저장소, Branch에main, Main file path에app.py를 넣습니다. - Advanced settings를 열어 Python version은 3.11로 고르고, Secrets 칸에 아래 모양으로 키를 넣습니다.
OPENAI_API_KEY="sk-..."
- 값을 큰따옴표로 감쌉니다.
.env와 형식이 다릅니다. - 공개 앱은 주소를 아는 누구나 질문할 수 있고, 질문마다 내 API 요금이 나갑니다. OpenAI 계정에 월 사용 한도를 걸어 둡니다.
3. 배포 실행
Deploy 버튼을 누릅니다. 첫 배포는 패키지 설치 때문에 몇 분 걸립니다.
4. 배포 결과 확인
설치와 실행이 끝나면 https://앱이름.streamlit.app 형태의 공개 주소가 생깁니다. 주소를 열어 내 컴퓨터에서 실행한 화면과 같은지 확인합니다.
- 배포판에서 질문했을 때 답과 출처가 나오나요?
- 2단계 테스트의 질문 하나를 넣어 내 컴퓨터에서와 같은 답이 나오나요?
5. API 키를 찾을 수 없다고 나오면
화면 오른쪽 아래 Manage app을 눌러 로그를 열고, 오류 화면과 로그 내용을 함께 붙여 보냅니다.
Streamlit Cloud에서 Secrets를 저장했는데도 OpenAI API 키를 찾을 수 없다고 나와. 현재 화면과 로그를 기준으로 원인을 확인하고, 필요한 코드 수정과 GitHub 푸시까지 처리해줘.
한 번 배포해 두면, 이후에는 GitHub에 push할 때마다 배포판이 자동으로 새 코드로 다시 시작됩니다.
기능 추가
배포까지 끝났다면 기능을 하나씩 붙여 봅니다. 프롬프트마다 구현, 실행 검증, push까지 한 번에 맡깁니다. 하나를 끝내고 배포판에서 확인한 뒤 다음으로 넘어갑니다.
01. 대화 기록 유지
"그럼 그건 얼마야?"처럼 앞 대화에 기대는 질문에도 답하게 합니다.
현재 Streamlit RAG 챗봇에 대화 기록 기반 후속 질문 기능을 추가해줘. 이전 대화 내용을 검색어 보정과 답변 문맥에 반영하되, 답변은 DATA 문서 근거만 사용해줘. 구형 LangChain 체인은 사용하지 말고 최신 Runnable 방식으로 구현해줘. 구현·실행 검증 후 GitHub origin/main에 푸시해줘.
- "친지 집에 숙박했을 때 숙박비는?"에 이어 "호텔이면?"이라고만 물어도 숙박비 이야기로 이어지나요?
02. 질문 예시와 초기 안내
Streamlit RAG 챗봇 첫 화면에 초보자용 사용 안내와 예시 질문 버튼 5개를 추가해줘. 예시 질문을 누르면 해당 질문이 채팅 입력으로 전달되어 바로 답변을 생성하게 해줘. 공무원 여비 문서 범위에 맞는 자연스러운 한국어 예시를 사용해줘. 구현·실행 검증 후 GitHub origin/main에 푸시해줘.
- 버튼을 누르면 질문을 직접 입력했을 때와 같은 답이 나오나요?
- 예시 질문 5개가 모두 문서에서 답할 수 있는 질문인가요?
03. 답변 신뢰도 표시
RAG 검색 결과의 유사도 점수를 이용해 답변 신뢰도(높음, 보통, 낮음)를 표시하는 기능을 추가해줘. 점수가 낮으면 문서에서 확인하기 어렵다는 안내를 강화하고, 계산 기준에는 한글 주석을 달아줘. InMemoryVectorStore의 최신 API를 사용해줘. 구현·실행 검증 후 GitHub origin/main에 푸시해줘.
- "민간기업 직원 출장비 기준"처럼 문서 밖의 질문에서 신뢰도가 낮음으로 나오나요?
- 높음, 보통, 낮음을 나누는 점수 기준이 코드 주석에 적혀 있나요? 그 기준이 적당한지 질문 몇 개로 확인해 보세요.
다음 실습
| 다음 실습 | 강의 추천 RAG 챗봇 만들기 · 데이터 수집부터 갱신까지 실습파일의 course-bot 폴더를 씁니다. 검증하고 고치기, 데이터 갱신 운영까지 다룹니다. |