마침내 인공지능을 다뤄야하는 날이 오고야 말았다..
프로젝트에서 LLM을 이용한 쿼리 생성을 해야하는 모듈이 필요했기 때문이다.
허나 구조는 단순했다.
LLM 모듈을 사전 프롬프트 할 서버만 있으면 되기 때문이다.
우선 외부 모듈이기에 기존 서비스와 통신하기 위해 fast api를 통해 api 통신이 가능하도록 구현했다.
@app.post("/query")
def query(req: QueryRequest):
try:
result = generate_sql_and_explanation(req.question)
raw_sql = result["sql"]
explanation = result["explanation"]
print("=== GENERATED SQL ===")
print(raw_sql)
print("=====================")
sql = sanitize_sql(raw_sql)
print("=== SANITIZED SQL ===")
print(sql)
print("=====================")
if sql == "NOT_POSSIBLE":
return {"result": "NOT_POSSIBLE"}
result = execute_sql(sql)
return {
"sql": sql,
"explanation": explanation,
"result": result
}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
sql을 생성하는 곳에서는 open ai api를 활용해 내가 사전에 입력해둔 프롬프트와 db 스키마를 기반으로 output을 만들었다.
def generate_sql_and_explanation(question: str) -> dict:
prompt = build_prompt(question)
resp = client.responses.create(
model="gpt-4.1",
input=prompt
)
raw = resp.output_text.strip()
try:
return json.loads(raw)
except json.JSONDecodeError:
raise ValueError(f"LLM returned invalid JSON:\n{raw}")
그런데 만들어진 결과가 ```로 감싸진 형태이길래 sanitize_sql 이란 메소드를 만들어서 전처리를 했고, 미리 설정해둔 db 정보에 맞춰 sql문을 실행해서 데이터를 조회하는 식으로 구현했다.
처음에는 기본도 모르는 상황에서 구현이 매우 어려울 것이라고 생각했는데 레퍼런스들을 보며 구현하니까 쉽게 할 수 있었고 재미도 있었다.
MCP 클라이언트를 추가로 개발해서 모델이 직접 쿼리까지 날리는 것을 최종 목표로 개발을 하고 있다.