Phase 4 · AI 및 자연어 처리

코딩 없이 채팅으로, 회계자료와 대화하는 시스템

엑셀에서 VLOOKUP과 피벗 테이블을 수작업으로 돌릴 필요가 없습니다.
"작년 대비 매출이 30% 증가한 거래처를 찾아줘"라고 치면, AI가 쿼리를 짜고 파이썬이 DB를 조회하여 정답을 말해주는 나만의 회계 비서를 완성합니다.

예상 학습 시간 : 180분
난이도 : ★★★★★
사전 단계 : Python + AI 결합 (Step 15)
다음 단계 : Streamlit 웹 대시보드 만들기 (예정)
01

잘못된 AI vs 올바른 실무 AI (RAG 구조)

15단계에서도 배웠듯, AI에게 10만 건의 전표를 보여주고 "매출 상위 10개 뽑아봐"라고 하면 AI는 숫자를 지어내거나(할루시네이션) 연산 오류를 일으킵니다.
반드시 "AI는 의도만 분석하고, 연산은 파이썬(SQL)이 하는" 구조로 설계해야 합니다.

2026년 매출 상위 5개 거래처를 알려줘.
[Step 1] AI가 의도를 파악하여 SELECT SQL 문법을 작성함
[Step 2] 파이썬이 SQL을 넘겨받아 MariaDB에서 실제 데이터(숫자)를 계산 및 추출함
[Step 3] 파이썬이 추출한 숫자 결과를 다시 AI에게 던져주며 "이걸로 대답해" 라고 지시함
2026년 기준 매출 1위는 ABC상사(12억 원), 2위는 DEF기업(9.8억 원)입니다. 전체적으로 전년 대비 증가 추세를...

이것이 바로 기업용 AI 도입의 핵심인 RAG (Retrieval-Augmented Generation, 검색 증강 생성)의 기초입니다.

02

AI에게 SQL 쿼리 생성시키기 (Text-to-SQL)

자연어를 입력받으면, AI에게 우리 회사의 DB 테이블 구조를 알려주고 SQL을 생성하게 만듭니다.

📝 프롬프트 엔지니어링
system_prompt = """
당신은 회계자료 분석 시스템의 SQL 생성 AI입니다.
다음 데이터베이스 스키마만 사용할 수 있습니다.

[테이블: transactions]
- transaction_date (날짜)
- customer (거래처명)
- transaction_type (구분: '매출' 또는 '매입')
- amount (금액)

[규칙]
1. SELECT 문만 생성하십시오.
2. 질문에 필요한 데이터만 GROUP BY, ORDER BY, LIMIT을 사용해 조회하십시오.
3. 어떠한 부연설명도 없이 오직 순수한 SQL 코드만 반환하십시오.
"""

user_question = "2026년 매출이 가장 많은 거래처 3곳을 뽑아줘."
03

(매우중요) AI가 만든 SQL 검증 및 차단

AI가 미쳐서 DELETE FROM transactions 라는 코드를 생성하면 회사가 망할 수 있습니다. 조회 전용(ReadOnly) DB 계정을 사용하는 것이 1원칙이며, 파이썬 코드 레벨에서도 철저히 방어해야 합니다.

def validate_sql(sql_query):
    sql = sql_query.strip().lower()
    
    # 1. 무조건 SELECT로 시작해야 함
    if not sql.startswith("select"):
        raise ValueError("조회(SELECT) 명령만 허용됩니다.")
        
    # 2. 데이터를 변경/삭제하는 구문 절대 금지
    forbidden_keywords = ["delete", "update", "insert", "drop", "alter"]
    for word in forbidden_keywords:
        if word in sql:
            raise ValueError("보안 정책상 허용되지 않는 키워드가 포함되었습니다.")
            
    return True
04

파이썬에서 실제 데이터 긁어오기

검증을 통과한 SQL을 파이썬의 pandaspymysql을 이용해 실제 DB로 날려 결과를 받아옵니다. 여기서 진짜 회계 수치가 계산됩니다.

# AI가 생성한 SQL이라고 가정
ai_generated_sql = """
SELECT customer, SUM(amount) as total_sales
FROM transactions
WHERE transaction_type = '매출' AND transaction_date LIKE '2026%'
GROUP BY customer
ORDER BY total_sales DESC
LIMIT 3;
"""

if validate_sql(ai_generated_sql):
    # DB 연동 후 데이터 추출 (12단계 내용 복습)
    conn = mysql.connector.connect(user="readonly", password="***", database="acc")
    df_result = pd.read_sql(ai_generated_sql, conn)
    conn.close()
05

최종 요약: AI에게 데이터를 주고 말하게 하기

파이썬이 가져온 DataFrame 결과표를 텍스트로 변환하여 AI에게 "이 표를 보고 사용자의 원래 질문에 답해!"라고 2차 프롬프트를 날립니다.

# 결과를 텍스트 형식으로 변환
data_text = df_result.to_string(index=False)

final_prompt = f"""
사용자 질문: {user_question}

데이터베이스 조회 결과:
{data_text}

위 조회 결과를 바탕으로 사용자에게 자연스럽고 명확하게 답변해줘.
숫자는 읽기 쉽게 '원' 단위를 붙여서 요약해줘.
"""

# AI 호출 (ask_ai 함수는 15단계에서 만든 것)
final_answer = ask_ai(final_prompt)
print(final_answer)
RAG 시스템의 위력

AI는 자기가 직접 숫자를 더하거나 정렬하지 않았습니다. 오직 파이썬이 완벽하게 계산해 낸 ABC상사: 1250000000 이라는 텍스트를 건네받아, 인간의 언어로 예쁘게 포장하는 역할만 수행한 것입니다. 이렇게 해야 회계 수치의 무결성을 보장할 수 있습니다.

06

최종 실무: 나만의 회계 AI 비서 만들기

사용자로부터 입력을 받아 SQL을 짜고, 조회하고, 답변하는 전체 챗봇 로직입니다.

AI Chatbot System
자연어 → SQL → 데이터 → 답변 자동화 파이프라인
import pandas as pd
from sqlalchemy import create_engine
import requests

# DB 엔진 세팅
engine = create_engine("mysql+pymysql://readonly:1234@localhost/accounting")

def chat_with_data(user_msg):
    print("\n🧑 사용자:", user_msg)
    
    # 1. AI에게 SQL 작성 지시
    sql_prompt = f"""
테이블: transactions (transaction_date, customer, transaction_type, amount)
질문: {user_msg}
위 질문을 해결하기 위한 MySQL SELECT 쿼리를 작성해. 백틱(```)이나 부연설명 없이 순수 쿼리만 출력해.
"""
    res = requests.post("http://localhost:11434/api/generate", 
                        json={"model": "gemma3:4b", "prompt": sql_prompt, "stream": False})
    sql_query = res.json()["response"].strip()
    print("🤖 (내부생성 SQL) ->", sql_query)
    
    # 2. SQL 검증 (보안)
    if not sql_query.lower().startswith("select"):
        return "죄송합니다. 조회 명령이 아닙니다."
        
    # 3. 파이썬이 데이터 가져오기
    try:
        df = pd.read_sql(sql_query, engine)
        if df.empty: return "조회된 데이터가 없습니다."
    except Exception as e:
        return f"데이터 조회 중 오류가 발생했습니다: {e}"
        
    # 4. 조회된 데이터를 바탕으로 AI에게 최종 답변 요구
    answer_prompt = f"""
사용자질문: {user_msg}
데이터결과:
{df.to_string(index=False)}
위 데이터를 바탕으로 질문에 대해 회계사처럼 전문적이고 자연스럽게 답변해. 숫자는 읽기 편하게 정리해.
"""
    res2 = requests.post("http://localhost:11434/api/generate", 
                         json={"model": "gemma3:4b", "prompt": answer_prompt, "stream": False})
    return "🤖 챗봇 답변:\n" + res2.json()["response"]

# 테스트 실행
print( chat_with_data("올해 가장 매출이 적은 거래처 3곳이 어디야?") )
17단계 예고: Streamlit 웹 대시보드 만들기

지금까지는 터미널 검은 창에서 파이썬 코드를 쳤습니다. 17단계에서는 Streamlit(스트림릿)이라는 마법의 라이브러리를 사용하여, 지금까지 만든 시스템을 그럴듯한 웹사이트 화면(UI)으로 탈바꿈시킵니다.

엑셀 파일 업로드 버튼, 그래프, 챗봇 입력창이 있는 어엿한 '회계 자동화 웹 솔루션'을 개발해 봅니다!

Step 15 : Python + AI 결합 Step 17 : 웹 대시보드 구축 (준비중)