๋ณธ๋ฌธ

[์‹ค์Šต] 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


 

https://python.langchain.com/docs/use_cases/sql/quickstart

 

 

โœ…  ์‹ค์Šต ์ž๋ฃŒ

https://colab.research.google.com/github/i-am-shuan/learn-langchain/blob/main/langchain_sql_agents_example.ipynb#scrollTo=pJ6i2qcdZ0Ow

 

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;

 

 

 

few-shot prompt ์‚ฌ์šฉ์ „ํ›„ ์„ฑ๋Šฅ๋น„๊ต

 

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 ๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•œ๋‹ค.
    • ์„ฑ๋Šฅ ๋น„๊ต
      • 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์— ์ฟผ๋ฆฌ ์ž‘์„ฑ์‹œ ํ”ํ•˜๊ฒŒ ์‹ค์ˆ˜ํ•˜๋Š” ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๋„๋ก ์š”์ฒญํ•˜๊ณ  ๋ณด์™„ํ•˜์—ฌ ์ฟผ๋ฆฌ์˜ ์•ˆ์ •์„ฑ๊ณผ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

FIRST_DRAFT_QUERY & FINAL_ANSWER_QUERY

 

 

โœ…  ์‹ค์Šต ์ž๋ฃŒ

https://colab.research.google.com/github/i-am-shuan/learn-langchain/blob/main/langchain_sql_query_validation.ipynb

 

langchain_sql_query_validation.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

 

๋ฐ˜์‘ํ˜•

๊ณต์œ 

๋Œ“๊ธ€