8️⃣SQL Agent & Chain
LangChain: SQL Agent 사용 사례
엔터프라이즈 데이터는 종종 SQL 데이터베이스에 저장됩니다.
LLM을 사용하면 자연어를 사용하여 SQL 데이터베이스와 상호 작용할 수 있습니다.
LangChain은 자연어 프롬프트를 기반으로 SQL 쿼리를 작성하고 실행할 수 있는 SQL 체인 및 에이전트를 제공합니다.
이들은 SQLAlchemy에서 지원하는 모든 SQL 언어(예: MySQL, PostgreSQL, Oracle SQL, Databricks, SQLite)와 호환됩니다.
다음과 같은 사용 사례를 지원합니다:
자연어 질문을 기반으로 실행할 쿼리 생성
데이터베이스 데이터를 기반으로 질문에 답변할 수 있는 챗봇 만들기
사용자가 분석하고자 하는 인사이트를 기반으로 사용자 지정 대시보드 구축
개요
LangChain은 SQL 데이터베이스와 상호 작용할 수 있는 도구를 제공합니다:
자연어 사용자 질문을 기반으로 'SQL 쿼리 작성'
쿼리 생성 및 실행을 위해 체인을 사용하여 'SQL 데이터베이스 쿼리'를 수행합니다.
강력하고 유연한 쿼리를 위해 에이전트를 사용하여 'SQL 데이터베이스와 상호작용하기'
환경 설정
먼저 필요한 패키지를 가져오고 환경 변수를 설정합니다:
아래 예는 Chinook DB와의 SQLite 연결을 수행합니다.
이 파일을 디렉터리에
Chinook_Sqlite.sql로 저장합니다.sqlite3 Chinook.db를 실행합니다..read Chinook_Sqlite.sql실행테스트
SELECT * FROM Artist LIMIT 10;
이제 Chinhook.db가 디렉토리에 있습니다.
SQL 쿼리를 생성하고 실행하기 위해 SQLDatabaseChain을 생성해 보겠습니다.
Case 1: Text-to-SQL query
SQL 쿼리를 작성할 체인을 만들어 보겠습니다:
사용자 질문을 기반으로 SQL 쿼리를 작성하고 나면 쿼리를 실행할 수 있습니다:
보시다시피 SQL 쿼리 빌더 체인은 쿼리를 생성만하고 쿼리 실행은 별도로 처리했습니다.
Case 2: Text-to-SQL query and execution
We can use SQLDatabaseChain from langchain_experimental to create and run SQL queries.
보시다시피 이전 사례와 동일한 결과를 얻을 수 있습니다. 여기서 체인은 쿼리 실행도 처리하고 사용자 질문과 쿼리 결과를 기반으로 최종 답변을 제공합니다.
이 방식은 'SQL 인젝션'에 취약하기 때문에 사용 시 주의해야 합니다:
체인이 LLM에 의해 생성되고 검증되지 않은 쿼리를 실행하고 있습니다.
예: 레코드가 의도치 않게 생성, 수정 또는 삭제될 수 있음_.
이것이 바로 SQLDatabaseChain이 랭체인_실험 안에 있는 이유입니다.
사례 3: SQL 에이전트
LangChain에는 SQLDatabaseChain보다 SQL 데이터베이스와 상호 작용하는 더 유연한 방법을 제공하는 SQL 에이전트가 있습니다.
SQL 에이전트 사용의 주요 장점은 다음과 같습니다:
데이터베이스의 스키마뿐만 아니라 데이터베이스의 콘텐츠(예: 특정 테이블 설명)를 기반으로 질문에 답변할 수 있습니다.
생성된 쿼리를 실행하고 트레이스백을 포착하여 올바르게 다시 생성함으로써 오류로부터 복구할 수 있습니다.
에이전트를 초기화하기 위해 create_sql_agent 함수를 사용합니다.
이 에이전트에는 다음과 같은 도구가 포함된 SQLDatabaseToolkit이 포함되어 있습니다:
쿼리 생성 및 실행
쿼리 구문 확인
테이블 설명 검색
... 등
Agent task example #1 - Running queries
Agent task example #2 - Describing a Table
SQL 툴킷 확장하기
기본 제공되는 SQL 툴킷에는 데이터베이스 작업을 시작하는 데 필요한 도구가 포함되어 있지만, 에이전트의 기능을 확장하는 데 몇 가지 추가 도구가 유용할 수 있는 경우가 종종 있습니다. 이는 솔루션의 전반적인 성능을 개선하기 위해 솔루션에서 도메인별 지식을 사용하려고 할 때 특히 유용합니다.
몇 가지 예는 다음과 같습니다:
Dynamic Few shot 예시 포함
열 필터로 사용할 고유명사의 철자 오류 찾기
이러한 특정 사용 사례를 처리하는 별도의 도구를 만들어 표준 SQL 도구 키트에 보완용으로 포함할 수 있습니다. 이 두 가지 사용자 정의 도구를 포함하는 방법을 살펴보겠습니다.
Dynamic Few shot 예제 포함
Dynamic Few shot 예제를 포함하려면 사용자의 질문과 의미적으로 유사한 예제를 검색하기 위해 벡터 데이터베이스를 처리하는 사용자 지정 검색 도구가 필요합니다.
몇 가지 예제가 포함된 사전을 만드는 것부터 시작하겠습니다:
그런 다음 질문 목록을 사용하여 검색기를 생성하고 대상 SQL 쿼리를 메타데이터로 할당할 수 있습니다:
이제 고유한 사용자 지정 도구를 만들어 'create_sql_agent' 함수에 새 도구로 추가할 수 있습니다:
이제 사용 사례를 고려하여 표준 SQL 에이전트 접미사를 조정하여 에이전트를 만들 수 있습니다. 이를 처리하는 가장 간단한 방법은 도구 설명에 포함시키는 것이지만, 이것만으로는 충분하지 않은 경우가 많으므로 생성자의 '접미사' 인수를 사용하여 에이전트 프롬프트에서 이를 지정해야 합니다.
Let's try it out:
보시다시피, 에이전트는 먼저 sql_get_similar_examples 도구를 사용하여 유사한 예제를 검색했습니다. 질문이 다른 몇 개의 샷 예제와 매우 유사했기 때문에 에이전트는 표준 툴킷의 다른 툴을 사용할 필요가 없었기 때문에 시간과 토큰을 절약할 수 있었습니다.
고유명사의 맞춤법 오류 찾기 및 수정하기
주소, 노래 이름 또는 아티스트와 같은 고유명사가 포함된 열을 필터링하려면 먼저 철자를 다시 확인하여 데이터를 올바르게 필터링해야 합니다.
데이터베이스에 존재하는 모든 고유 고유명사를 사용하여 벡터 저장소를 생성하면 됩니다. 그런 다음 사용자가 질문에 고유 명사를 포함할 때마다 상담원이 해당 벡터 저장소를 쿼리하여 해당 단어의 올바른 철자를 찾도록 할 수 있습니다. 이러한 방식으로 에이전트는 대상 쿼리를 작성하기 전에 사용자가 어떤 엔티티를 참조하는지 이해할 수 있습니다.
메타데이터 없이 고유명사를 임베드한 다음 철자가 틀린 사용자 질문과 가장 유사한 것을 쿼리하는 방식으로 몇 가지 샷과 유사한 접근 방식을 따라 해 보겠습니다.
먼저 원하는 각 엔티티에 대한 고유 값이 필요하며, 이를 위해 결과를 요소 목록으로 파싱하는 함수를 정의합니다:
이제 사용자 지정 리트리버 도구와 최종 에이전트 생성을 진행할 수 있습니다:
Let's try it out:
보시다시피 에이전트는 이 특정 아티스트에 대한 데이터베이스를 올바르게 쿼리하는 방법을 확인하기 위해 name_search 도구를 사용했습니다.
Pymysql 활용 DB에 직접 접속
SQLDatabase,SQLDatabaseCahin활용
Last updated