상세 컨텐츠

본문 제목

알고리즘 문제 해결(?)

출장 자동화 시스템

by myeongjaechoi 2025. 8. 17. 14:15

본문

수정 전 Java 코드

import java.util.List;

public record Hotel(
    String departure_date,
    String arrival_date,
    String destination,
    int guests,
    long budget,
    List<String> requirements
) {

}
public record HotelList(
    List<Hotel> hotels
) {

}
public HotelAndMemberInfoResponse extract(Long memberId, PromptRequest request) {
    HotelList hotelList = extractHotel(request);
    MemberInfoList memberInfoList = extractNames(memberId,request);
    return new HotelAndMemberInfoResponse(hotelList,memberInfoList);
  }

  public HotelList extractHotel(PromptRequest request) {
    String fullPrompt = """
        다음 문장에서 출장 정보를 추출해줘. 올해는 2025년이야. 예산은 숙박 일수 만큼 나눠.
        문장을 파악해서 요청자와 같이 출장을 가는 사람 이름이면 그것에 맞춰 인원 수 추가
        문장 :
        """ + request.prompt();

    return chatClient.prompt()
        .user(p->p.text(fullPrompt))
        .call()
        .entity(HotelList.class);
  }

  public MemberInfoList extractNames(Long memberId,PromptRequest request) {
    String fullPrompt = """
        다음 문장에서 사람 이름을 추출해줘. 만약 프롬프트 요청한 사람이 있으면 '요청자' 라고 저장해줘.
        문장 :
        """ + request.prompt();

    NameList nameList = chatClient.prompt()
        .user(p->p.text(fullPrompt))
        .call()
        .entity(NameList.class);

    return extractMemberInfo(memberId,nameList);
  }

수정 전 Python 코드

async def process_hotels_and_members(hotel_list: List[Hotel], member_list: List[MemberInfo]):
    results = []
    n = min(len(hotel_list), len(member_list))
    for i in range(n):
        hotel = hotel_list[i]
        member = member_list[i]
        # hotel_agent는 dict 타입을 받음 (model_dump)
        print("FIRSTNAME:"+member.firstName)
        SENSITIVE_DATA = {
    "firstName": member.firstName,
    "lastName": member.lastName,
    "email": member.email,
    "phoneNumber": member.phoneNumber
}
        result = await start_hotel(hotel.model_dump(), SENSITIVE_DATA)
        results.append(result)
    return results

@app.post("/hotel-data")
async def receive_data(data: HotelAndMemberInfoResponse):
    hotel_list = data.hotelList.hotels
    member_list = data.memberInfoList.memberInfoGetResponseList

    results = await process_hotels_and_members(hotel_list, member_list)
    return {"detail": results}

이때 문제점은 만약 한 사람이 여러명의 숙소를 예약할 때 DB에 개인정보가 저장되지 않은 사람이면 문제가 실행이 한 번 밖에 안 된다.

Ex)

"나는 8월 22일부터 8월24일 까지 출장을 가. 베트남으로가고 예산은 15만원이야. 그리고 9월 11일부터 9월13일 까지 인천으로 출장 가는 것도 예약해줘"

그래서 생각해낸 것이 Hotel.class에 List<String> names 를 추가하여 숙소 정보에 사람 이름을 넣는 것이였다. 만약 이름이 없다면 프롬프트 요청자로 대체하게 하였다. 또한 파이썬의 for문은 말이 안 됐었다. 무조건 호텔 수만큼 돌려야 하는데 min으로 비교해서 for문 돌리는 방식이 잘못됐었다. 

수정 후 Java 코드

public HotelList extractHotelInfo(Long memberId,PromptRequest request) {
  Member member = memberRepository.findByMemberId(memberId)
      .orElseThrow(MemberNotFoundException::new);

  String fullPrompt = String.format(
      "다음 문장에서 출장 정보를 추출해줘. 올해는 2025년이야. 예산은 숙박 일수 만큼 나눠.\n" +
          "출발일은 departure_date 에 저장하고 도착일은 arrival_date 에 저장해.\n" +
          "문장을 파악해서 요청자와 같이 출장을 가는 사람 이름이면 그것에 맞춰 인원 수 추가.\n" +
          "출장 정보 한 개당 최소 한 명의 이름 필요.\n" +
          "만약 이름이 출장 정보에 없다면 %s 이름 추가.\n" +
          "문장 :\n%s",
      member.getName(),
      request.prompt()
  );

  return chatClient.prompt()
      .user(p -> p.text(fullPrompt))
      .call()
      .entity(HotelList.class);
}
import java.util.List;

public record Hotel(
    String departure_date,
    String arrival_date,
    String destination,
    int guests,
    int budget,
    List<String> requirements,
    List<String> names
) {

}

수정 후 Python 코드

async def process_hotels_and_members(hotel_list: List[Hotel], member_list: List[MemberInfo]):
results = []

for i, hotel in enumerate(hotel_list):
print(f"호텔 {i} 이름 리스트: {hotel.names}")

for member in member_list:
if any(member.name in item for item in hotel.names):
print(f"호텔 {i} anget 호출 및 멤버 이름 {member.name}")
SENSITIVE_DATA = {
"firstName": member.firstName,
"lastName": member.lastName,
"email": member.email,
"phoneNumber": member.phoneNumber
}
result = await start_hotel(hotel.model_dump(), SENSITIVE_DATA)
results.append(result)
return results

이렇게 하면 모든 문제가 해결되었다!

관련글 더보기