툴 A → 툴 B → 툴 C → 결과.
코드로 순서를 박아둔 워크플로우.
한 시나리오는 완벽하다. 시나리오가 바뀌면 다시 짜야 한다.
사람이 하던 업무를 LLM·툴의 직렬 호출로 재현.
이 챕터에선 우리가 직접 def workflow(): 로 순서를 적는다.
RAG가 반환하는 건 청크 조각. 사람 단위로 보려면 resume_id 로 DB를 한 번 더.
툴 둘을 엮어야 비로소 '검색 + 조회'가 완성된다.
def workflow_1(user_prompt): # 1. RAG 검색 rag_results = retrieve_from_rag(user_prompt) # 2. LLM이 적합한 후보 1명 선정 (JSON 출력) selected = generate_response( system_prompt=recommend_resume_system_prompt, user_prompt=f"{user_prompt}\n[검색결과]{rag_results}", ) resume_id = int(json.loads(selected)["resume_ID"]) # 3. DB에서 전체 이력서 조회 resume = execute_sql(f"SELECT * FROM resume WHERE ID = {resume_id}") # 4. LLM이 요약 summary = generate_response( system_prompt=resume_summary_system_prompt, user_prompt=f"{user_prompt}\n[이력서]{resume[0][...]}", )
단계 사이마다 LLM 응답을 다음 툴의 입력으로 변환.
json.loads() 로 LLM의 JSON 출력을 파이썬 객체로.
def workflow_2(user_prompt): sql_query = generate_response(sql_gen_prompt, user_prompt) # 1. SQL 생성 resume = execute_sql(sql_query) # 2. 이력서 jp = execute_sql("SELECT ... FROM job_posting") # 3. 공고 eval_criteria = get_confluence_page_content(CRITERIA_PAGE_ID) # 4. 기준표 eval_result = generate_response(eval_prompt, f"{resume}{jp}{eval_criteria}") # 5. 평가 json_response = generate_response(json_prompt, eval_result) # 6. JSON save_excel(json_response) # 7. 저장 report = generate_response(report_prompt, eval_result) # 8. 보고서 send_email(report) # 9. 발송
아홉 개 호출이 한 줄씩. 각 단계의 입출력이 다음 단계 입력에 정확히 들어가도록 박혀 있다.
— 이게 '고정' 워크플로우의 의미.
툴 순서를 사람이 박는 대신 LLM이 정하게 만들면?
다음 챕터에서 처음으로 LLM에게 '어떤 툴을 부를지' 묻는다.