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);
}
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)
그래서 생각해낸 것이 Hotel.class에 List<String> names 를 추가하여 숙소 정보에 사람 이름을 넣는 것이였다. 만약 이름이 없다면 프롬프트 요청자로 대체하게 하였다. 또한 파이썬의 for문은 말이 안 됐었다. 무조건 호텔 수만큼 돌려야 하는데 min으로 비교해서 for문 돌리는 방식이 잘못됐었다.
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
) {
}
이렇게 하면 모든 문제가 해결되었다!
| Spring 비동기 호출과 논블로킹 I/O 적용 (0) | 2025.08.28 |
|---|---|
| Agnet 서버와 Spring 서버 상호작용 개선 및 통합 예약 처리 전략 (0) | 2025.08.28 |
| 알고리즘 문제 (2) | 2025.08.16 |
| MJK 최종 발표 (0) | 2025.08.02 |
| Skyvern, BeautifulSoup + palywright + llama3.2-korean-5B (0) | 2025.05.21 |