๋ณธ๋ฌธ
[์ค์ต] SQL Quicktart (Text to SQL) ์ฌํ
โ ์ค์ต ์ค๋น๋ฌผ: apikey
https://server-engineer.tistory.com/983
โ ์ค์ต ์๋ฃ
โ ์๋น์ค ์ค๋ช
์ค๋ช
๋ญ์ฒด์ธ(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์ ์ฟผ๋ฆฌ ์์ฑ์ ํํ๊ฒ ์ค์ํ๋ ๋ถ๋ถ์ ํ์ธํ๋๋ก ์์ฒญํ๊ณ ๋ณด์ํ์ฌ ์ฟผ๋ฆฌ์ ์์ ์ฑ๊ณผ ํ์ง์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
โ ์ค์ต ์๋ฃ
๋๊ธ