메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

개인 PC 텍스트 검색 채봇

데브카페
Devcafe (토론 | 기여)님의 2025년 6월 24일 (화) 01:38 판 (새 문서: = 개인 PC 텍스트 파일 기반 간단 챗봇 파이썬 프로그램 예제 = == 개요 == 개인 컴퓨터 내의 여러 `txt` 파일을 수집해서 벡터화하고, 질문 입력 시 가장 유사한 파일의 내용을 답변해주는 간단한 챗봇(Python CLI 형태) 예제입니다. 필수 패키지 설치 방법과, 작동 원리 그리고 파이썬 예제 코드를 미디어위키 표기법으로 정리했습니다. == 필요한 패키지 == * sentence-transfor...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

개인 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)

작동 방식 요약

  1. `./textfiles` 폴더 내의 여러 `.txt` 파일을 모두 읽어서 텍스트 데이터로 저장합니다.
  2. 파일 전체 내용을 벡터로 변환 및 ChromaDB 벡터DB에 등록합니다.
  3. 사용자가 질문을 하면 입력 질문을 벡터로 변환해서, 가장 유사한 벡터(=파일)을 찾아 일부 내용을 반환합니다.
  4. 'exit' 입력 시 종료됩니다.

참고 사항

  • 문서 응답 품질을 높이려면 소단락(문단 등) 단위로 쪼개어 벡터화하는 방식을 추천합니다.
  • CLI 콘솔에서 동작합니다. (웹, GUI 등은 streamlit 등으로 확장 가능)

Comments