FastAPI를 이용한 쿼리 생성기

devkwon·2026년 1월 30일

BackEnd

목록 보기
8/9

마침내 인공지능을 다뤄야하는 날이 오고야 말았다..
프로젝트에서 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 클라이언트를 추가로 개발해서 모델이 직접 쿼리까지 날리는 것을 최종 목표로 개발을 하고 있다.

0개의 댓글