다른 명령
개인 PC 텍스트 파일 기반 간단 챗봇 파이썬 프로그램 예제
개요
개인 컴퓨터 내의 여러 `txt` 파일을 수집해서 벡터화하고, 질문 입력 시 가장 유사한 파일의 내용을 답변해주는 간단한 챗봇(Python CLI 형태) 예제입니다. 필수 패키지 설치 방법과, 작동 원리 그리고 파이썬 예제 코드를 미디어위키 표기법으로 정리했습니다.
필요한 패키지
- sentence-transformers
- chromadb
설치 방법
pip install sentence-transformers chromadb
폴더 구조 예시
- 본인의 텍스트 파일들을 한 폴더(`./textfiles` 등)에 넣습니다.
파이썬 예제 코드
import os
from sentence_transformers import SentenceTransformer
import chromadb
from chromadb.config import Settings
# 1. 텍스트 파일 데이터 불러오기
def load_files_from_folder(folder_path):
texts = []
file_names = []
for filename in os.listdir(folder_path):
if filename.endswith(".txt"):
with open(os.path.join(folder_path, filename), "r", encoding='utf-8') as f:
texts.append(f.read())
file_names.append(filename)
return texts, file_names
# 2. 벡터DB 설정 (ChromaDB)
def create_chroma_db(texts, file_names):
client = chromadb.Client(Settings(chroma_db_impl="mem"))
collection = client.create_collection(name="docs")
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
embeddings = model.encode(texts).tolist()
collection.add(documents=texts, metadatas=[{"source": n} for n in file_names], ids=[str(i) for i in range(len(texts))], embeddings=embeddings)
return collection, model
# 3. 챗봇 답변 함수
def get_answer(user_input, collection, model, texts, file_names):
query_embedding = model.encode([user_input]).tolist()[0]
results = collection.query(query_embeddings=[query_embedding], n_results=1)
idx = int(results['ids'][0][0])
source = file_names[idx]
answer = texts[idx][:300] # 첫 300자만 표시 (예시)
return f"({source})에서 찾은 내용:\n{answer}..."
# --------
# 실행 파트
folder_path = "./textfiles" # 여기에 본인 폴더 경로 지정
print("텍스트 파일을 읽고 데이터를 준비합니다.")
texts, file_names = load_files_from_folder(folder_path)
collection, model = create_chroma_db(texts, file_names)
print("준비 완료. 질문을 입력하세요. 종료하려면 'exit'를 입력하세요.")
while True:
user_input = input("\n질문: ")
if user_input.lower().strip() == 'exit':
print("챗봇을 종료합니다.")
break
answer = get_answer(user_input, collection, model, texts, file_names)
print(answer)
작동 방식 요약
- `./textfiles` 폴더 내의 여러 `.txt` 파일을 모두 읽어서 텍스트 데이터로 저장합니다.
- 파일 전체 내용을 벡터로 변환 및 ChromaDB 벡터DB에 등록합니다.
- 사용자가 질문을 하면 입력 질문을 벡터로 변환해서, 가장 유사한 벡터(=파일)을 찾아 일부 내용을 반환합니다.
- 'exit' 입력 시 종료됩니다.
참고 사항
- 문서 응답 품질을 높이려면 소단락(문단 등) 단위로 쪼개어 벡터화하는 방식을 추천합니다.
- CLI 콘솔에서 동작합니다. (웹, GUI 등은 streamlit 등으로 확장 가능)