# SQL 에이전트 소개 및 활용
 
## SQL 에이전트란 무엇인가?
 
SQL 에이전트는 자연어 질문을 SQL 쿼리로 변환하여 데이터베이스에서 데이터를 추출하는 데 도움을 주는 도구입니다. 랭체인(Langchain)에서 제공하는 기능 중 하나이며, 데이터 분석가가 아니더라도 쉽게 데이터에 접근하고 분석할 수 있도록 지원합니다.
 
## SQL 에이전트의 주요 기능 및 사용 사례
 
*   **자연어 기반 쿼리 생성:** 사용자의 자연어 질문을 이해하고, 이를 바탕으로 SQL 쿼리를 자동으로 생성합니다.
*   **데이터 기반 질의 응답:** 데이터베이스의 데이터를 기반으로 질문에 대한 답변을 제공합니다.
*   **대시보드 구축 지원:** 사용자가 원하는 인사이트를 기반으로 대시보드를 쉽게 구축할 수 있도록 지원합니다.
 
예를 들어, "직원이 몇 명이야?" 와 같은 자연어 질문을 입력하면, SQL 에이전트는 해당 질문을 `SELECT COUNT(*) FROM employees` 와 같은 SQL 쿼리로 변환하고, 데이터베이스에서 결과를 추출하여 "8명의 직원이 있습니다" 와 같은 답변을 제공합니다.
 
## SQL 에이전트 사용 방법 (랭체인 예시)
 
1.  **필요 라이브러리 설치:** `langchain`, `langchain-experimental`, `openai` 라이브러리를 설치합니다.
    ```bash
    pip install langchain langchain-experimental openai
    ```
2.  **OpenAI API 키 설정:** 환경 변수를 통해 OpenAI API 키를 설정합니다.
3.  **SQLite 데이터베이스 다운로드 및 업로드:** 실습을 위한 샘플 데이터베이스 (`chinook.db`)를 다운로드하고 Colab 환경에 업로드합니다.
4.  **데이터베이스 연결:** 랭체인을 사용하여 SQLite 데이터베이스에 연결합니다.
    ```python
    from langchain.utilities import SQLDatabase
    db = SQLDatabase.from_uri("sqlite:///./chinook.db")
    ```
5.  **LLM 모델 설정:** OpenAI의 LLM 모델을 설정합니다.
    ```python
    from langchain.llms import OpenAI
    llm = OpenAI(temperature=0)
    ```
6.  **SQL 데이터베이스 체인 생성:** LLM과 데이터베이스를 연결하여 SQL 쿼리 생성 및 실행 기능을 수행하는 체인을 생성합니다.
    ```python
    from langchain.chains import create_sql_db_chain
    db_chain = create_sql_db_chain(llm, db, verbose=True)
    ```
7.  **자연어 질문 실행:** 체인을 사용하여 자연어 질문을 실행합니다.
    ```python
    query = "몇 명의 직원이 있어?"
    response = db_chain.run(query)
    print(response)
    ```
8.  **SQL 쿼리 생성 체인 (SQLQuery 생성):** SQL 쿼리를 생성하는 체인을 별도로 생성합니다.
    ```python
    from langchain.chains import create_sql_query_chain
    query_chain = create_sql_query_chain(llm, db)
    query = "직원들의 근무 시간을 알려줘"
    sql_query = query_chain.run(query)
    print(sql_query)
    ```
 
9. **Text-to-SQL Execution 체인:** 자연어 질의를 SQL로 변환하고 실행하는 기능을 수행하는 체인을 생성합니다.
    ```python
    query = "나라별 총 매출은 얼마야?"
    response = db_chain.run(query)
    print(response)
    ```
 
## SQL 데이터베이스 체인 vs SQL 에이전트
 
*   **SQL 데이터베이스 체인:**
    *   장점: 간단한 구조로 구현이 쉽고, 기본적인 자연어-SQL 쿼리 변환 및 실행 기능을 제공합니다.
    *   단점: 복잡한 질의나 여러 단계를 거치는 분석에는 적합하지 않으며, 쿼리 생성 과정에 대한 제어가 어렵습니다.
*   **SQL 에이전트:**
    *   장점: 더 복잡한 질의를 처리할 수 있으며, 쿼리 생성 과정에서 여러 단계를 거쳐 더 정확한 결과를 얻을 수 있습니다. 테이블 스키마 검색, 쿼리 구문 확인 등 다양한 기능을 제공하며, 필요에 따라 사용자 정의 툴을 추가하여 확장할 수 있습니다.
    *   단점: 구현이 더 복잡하고, 여러 단계를 거치기 때문에 때로는 실행 시간이 더 길어질 수 있습니다.
 
## SQL 에이전트 (SQL Agent) 활용
 
SQL 에이전트는 SQL 데이터베이스 체인보다 더 유연하게 활용할 수 있습니다.
 
*   **쿼리 생성 및 실행:** SQL 데이터베이스 체인과 유사하게 자연어 질문을 SQL 쿼리로 변환하고 실행합니다.
*   **쿼리 구문 확인:** 생성된 SQL 쿼리 구문을 확인할 수 있습니다.
*   **테이블 설명 검색:** 데이터베이스 테이블의 설명을 검색할 수 있습니다.
 
### SQL 에이전트 실습
 
1.  **필요 라이브러리 및 모듈 임포트:** 필요한 라이브러리 및 모듈을 임포트합니다.
    ```python
    from langchain_experimental.agents.agent_toolkits import create_sql_agent
    from langchain.agents.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
    from langchain.agents import AgentType
    ```
2.  **SQL 에이전트 생성:** `create_sql_agent` 함수를 사용하여 SQL 에이전트를 생성합니다.
    ```python
    toolkit = SQLDatabaseToolkit(db=db, llm=llm)
    agent_executor = create_sql_agent(
        llm=llm,
        toolkit=toolkit,
        verbose=True,
        agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION
    )
    ```
3.  **자연어 질문 실행:** 에이전트를 사용하여 자연어 질문을 실행합니다.
    ```python
    query = "나라별 총 매출은 얼마야?"
    response = agent_executor.run(query)
    print(response)
    ```
4.  **테이블 설명 요청:** 에이전트를 사용하여 특정 테이블의 설명을 요청합니다.
    ```python
    query = "플레이리스트 트랙 테이블에 대해서 설명해줘"
    response = agent_executor.run(query)
    print(response)
    ```
 
### 추가 툴킷 활용 (유사 질의 및 철자 오류 수정)
 
1.  **동적 퓨샷 예제 활용:**
    *   LLM이 SQL 쿼리를 생성하는 데 어려움을 느낄 경우, 미리 정의된 예시들을 제공하여 LLM이 참고하도록 합니다.
    *   리트리버를 활용하여 사용자 질의와 유사한 예시를 검색하고, 이를 LLM의 답변 생성에 활용합니다.
    *   **필요 라이브러리:** `faiss-cpu`, `tiktoken`
        ```bash
        pip install faiss-cpu tiktoken
        ```
2.  **고유 명사 철자 오류 수정:**
    *   사용자가 질의에 고유 명사를 사용할 때 철자 오류가 발생할 수 있습니다.
    *   데이터베이스에 존재하는 모든 고유 명사를 임베딩하여 벡터 저장소를 생성합니다.
    *   사용자 질의에서 고유 명사를 포함하는 경우, 벡터 저장소에서 유사한 고유 명사를 검색하고, LLM이 이를 바탕으로 쿼리를 수정하도록 합니다.
 
## SQL 에이전트 사용 시 주의 사항
 
*   **SQL 인젝션 취약성:** SQL 에이전트는 SQL 인젝션 공격에 취약할 수 있으므로, 사용 시 주의해야 합니다.
*   **보안:** 특히 회사 내부 데이터베이스와 연동하는 경우, 데이터베이스 관리자와 협의하여 안전하게 사용해야 합니다.
 
## 결론
 
SQL 에이전트는 자연어를 사용하여 데이터베이스에 쉽게 접근하고 데이터를 분석할 수 있도록 해주는 강력한 도구입니다. 랭체인을 통해 쉽게 구현할 수 있으며, 퓨샷 및 철자 오류 수정 기능을 추가하여 정확도를 높일 수 있습니다. 다만, 보안에 유의하여 안전하게 사용하는 것이 중요합니다.