본문
[실습] SQL Quicktart (Text to SQL) 심화
✅ 실습 준비물: apikey
https://server-engineer.tistory.com/983
[실습] OpenAI apikey 발급 및 사용하기
1. 회원가입하기 먼저 OpenAI 플랫폼에 접속합니다. (바로가기) 홈페이지에서 회원가입 절차를 완료해주세요. 2. API 키 발급 받기 로그인 후, 오른쪽 상단에 있는 'View API Keys'를 클릭합니다. 직접 링
server-engineer.tistory.com

✅ 실습 자료
langchain_sql_agents_example.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
✅ 서비스 설명
설명
랭체인(LangChain) SQL 에이전트는 사용자가 자연어로 질문하면 SQL 쿼리를 자동으로 생성해주는 서비스입니다. 예를 들어, 사용자가 "2023년에 판매량이 가장 높았던 제품은?"이라고 질문하면, 에이전트는 다음과 같은 SQL 쿼리를 생성합니다.
SELECT product_name
FROM sales
WHERE year = 2023
ORDER BY sales_volume DESC
LIMIT 1;

SQL 에이전트에 다음의 모듈을 활용하여 서비스와 성능을 개선합니다.
- Using a dynamic few-shot prompt
- SQL에 대한 일정 지식을 미리 갖고 있을 때 그것을 활용해서 사용하는 방법에 대한 예시
- 에이전트 성능을 최적화하기 위해, 우리는 도메인 특화 지식(domian-specific knowledge)을 포함한 맞춤형 프롬프트를 제공할 수 있습니다.
- 이 경우, 사용자 입력에 기반하여 동적으로 few-shot 프롬프트를 구축하는 예제 선택기와 함께 few-shot prompt를 생성할 것입니다.
- 이것은 모델이 참조로 사용할 수 있는 관련 쿼리를 프롬프트에 삽입함으로써 모델이 더 나은 쿼리를 만들 수 있도록 도울 것입니다.
- SemanticSimilarityExampleSelector
- 사용자 input에 기반해서 example_selector 에 넣어놓은 example 중에서 가장 유사한 example을 찾아서 반환한다.
- 갖고 있는 예시 SQL query들을 OpenAI의 임베딩 모델을 이용하여 임베딩 후 ChromaDB에 저장
- 사용자로부터 텍스트를 입력받으면, (input 텍스트를 기반으로 유사한 데이터를 찾아올 수 있도록) 임베딩 후 ChromaDB에 저장한다.
- 이후 vectorDB(Chroma)에 저장된 값 중 가장 유사한 임베딩을 5개 정도 찾아서 반환한다.
- 최종적으로 LLM(GPT3.5)와 vector DB, system prompt를 연계하여 create_sql_agent 라는 모듈을 생성한다.
- 사용자 input에 기반해서 example_selector 에 넣어놓은 example 중에서 가장 유사한 example을 찾아서 반환한다.
- 성능 비교
- few-shot example이 없을 경우, 답변을 만들어내는 과정에서 내부적으로 GPT API를 호출하는 횟수 증가, 사용하는 토큰 갯수 증가. 결론적으로 더 많은 바용과 시간을 들여서 동일한 결과를 얻게된다.
- 따라서 도메인특화지식(domian-specific knowledge)을 갖고 있을 경우, 그것을 잘 녹여낸 few-shot prompt를 같이 넣어주게 되면 훨씬 효율적으로 SQL Agent를 활용할 수 있다.
- Dealing with high-cardinality columns
- 약간의 오타가 나더라도 그것을 감안하여 사용자가 의도한 답변을 만들어낼 수 있도록 하는 예시
- 주소, 노래 이름 또는 아티스트와 같은 고유명사를 포함한 컬럼을 필터링하기 위해서는, 데이터를 올바르게 필터링하기 위해 먼저 철자를 이중으로 확인해야 합니다.
- 이를 달성하기 위해 데이터베이스에 존재하는 모든 고유명사의 고유 값들로 벡터 저장소를 생성할 수 있습니다. 그런 다음 에이전트가 사용자의 질문에 고유명사를 포함할 때마다 그 벡터 저장소를 쿼리하여 해당 단어의 정확한 철자를 찾을 수 있습니다. 이 방식으로, 에이전트는 타겟 쿼리를 구축하기 전에 사용자가 어떤 엔티티를 참조하는지 확실히 이해할 수 있습니다.
- 먼저, 우리가 원하는 각 엔티티의 고유 값들을 필요로 하는데, 이를 위해 결과를 요소 목록으로 파싱하는 함수를 정의해야 합니다.
사용된 라이브러리
- langchain: 랭체인 프레임워크를 제공합니다.
- openagent: 랭체인 에이전트를 제공합니다.
- sqlglot: SQL 쿼리를 생성하는 데 사용됩니다.
- pandas: 데이터를 처리하는 데 사용됩니다.
- sqlite3: SQLite 데이터베이스를 처리하는 데 사용됩니다.
라이브러리별 역할
- langchain: 에이전트 체인을 만들고 실행하는 데 사용됩니다.
- openagent: SQL 에이전트를 제공합니다. SQL 에이전트는 사용자의 질문을 이해하고 적절한 SQL 쿼리를 생성하여 데이터베이스에서 질문에 대한 답변을 검색합니다.
- sqlglot: SQL 쿼리를 생성하는 데 사용됩니다. SQL 에이전트는 sqlglot를 사용하여 사용자의 질문을 기반으로 적절한 SQL 쿼리를 생성합니다.
- pandas: 데이터를 처리하는 데 사용됩니다. SQL 에이전트는 pandas를 사용하여 데이터베이스에서 검색한 결과를 처리하고 사용자에게 표시합니다.
- sqlite3: SQLite 데이터베이스를 처리하는 데 사용됩니다. SQL 에이전트는 sqlite3를 사용하여 데이터베이스에 연결하고 쿼리를 실행합니다.
✅ SQL Query validation 예제
LLM prompt에 쿼리 작성시 흔하게 실수하는 부분을 확인하도록 요청하고 보완하여 쿼리의 안정성과 품질을 향상시킬 수 있습니다.

✅ 실습 자료
langchain_sql_query_validation.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
댓글