Skip to content

Commit

Permalink
fix: gpt propmt 및 파싱 메서드 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
yo0oni committed Aug 7, 2024
1 parent 3f7e60f commit 10fa401
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 91 deletions.
117 changes: 58 additions & 59 deletions backend/src/main/java/com/isp/backend/domain/gpt/config/GptConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,71 +4,70 @@

@Configuration
public class GptConfig {
public static final String AUTHORIZATION = "Authorization";
public static final String BEARER = "Bearer ";
public static final String CHAT_MODEL = "gpt-4o";
public static final Integer MAX_TOKEN = 4095;
public static final Boolean STREAM = false;
public static final String ROLE = "user";
public static final Double TEMPERATURE = 1.0;
public static final Double TEMPERATURE = 0.9;
public static final String CHAT_URL = "https://api.openai.com/v1/chat/completions";
public static final String PROMPT = """
You're a great travel agency staff member.
I would like you to plan a package tour program to plan your travel itinerary.
Also, plan your itinerary based on the travel distance and famous tourist destinations.
Also, be sure to include the name of the landmark or location.
I want to visit a maximum of three attractions per day.
Make sure to plan for at least 10 hours of activity each day.
Please write the itinerary without using any special characters, only in plain text.
I would like the format to be as follows:
아래는 예시니까 참고만 해줘.
2024.02.06
- Go to location 26.69549000, 127.87642000
- See the place 26.69549000, 127.87642000
- Eat the Lunch 26.69549000, 127.87642000
- Go to location 26.69549000, 127.87642000
- See the place 26.69549000, 127.87642000
- Eat the dinner 26.69549000, 127.87642000
- shopping 26.69549000, 127.87642000
2024-02-07
- Go to location 26.69549000, 127.87642000
- See the place 26.69549000, 127.87642000
- Eat the Lunch 26.69549000, 127.87642000
- Go to location 26.69549000, 127.87642000
- See the place 26.69549000, 127.87642000
- Eat the dinner 26.69549000, 127.87642000
- shopping 26.69549000, 127.87642000
2024-02-08
- Go to location 26.69549000, 127.87642000
- See the place 26.69549000, 127.87642000
- Eat the Lunch 26.69549000, 127.87642000
- Go to location 26.69549000, 127.87642000
- See the place 26.69549000, 127.87642000
- Eat the dinner 26.69549000, 127.87642000
- shopping 26.69549000, 127.87642000
너가 여행 일정을 만들 때 필요한 정보는 아래와 같아.
여행지: %s
이번 여행의 목적: %s
여행에서 꼭 하고 싶은 활동: %s
여행에서 제외하고 싶은 활동: %s
한국에서 출국하는 날짜: %s
한국에 귀국하는 날짜: %s
No need to say anything else, just plan your schedule right away.
날짜 형식은 반드시 0000.00.00 을 지켜줘
And only include schedule-related content in the schedule you're creating.
We will have lunch and dinner at restaurants every day.
Be sure to recommend real, delicious, and famous restaurants.
Instead, create an itinerary that allows for a variety of experiences.
Include the latitude and longitude coordinates of each place with eight decimal places next to the itinerary item.
위에 예시로 적어둔 영어 문구는 "절대" 포함하지마.
시간은 안적어줘도돼.
Please create the result in Korean.""";
너는 매우 인기있는 여행사 직원이야.
여행사 고객을 위해 패키지 여행을 계획하여 일정을 만들어줘야 돼.
여행지: %s
이번 여행의 목적: %s
여행에 포함하고 싶은 활동: %s
여행에서 제외하고 싶은 활동: %s
한국에서 출국하는 날짜: %s
한국으로 귀국하는 날짜: %s
위 정보들을 토대로 일정을 만들어줘
너가 주의해야 할 사항은 아래 네가지야.
1. 고객이 원하는 목적지를 기반으로 여행 계획을 만들어 줘야 하는데, 너무 멀리 있는 장소들을 묶으면 안돼.
2. 하루에 최소 세 개의 명소를 방문하고 싶어.
3. 하루에 최소 9시간을 돌아다닐거야.
4. 3일 간의 여행이면 3일짜리 계획을 만들어주면 돼.
5. 장소의 좌푯값도 소수점까지 함께 알려줘
6. 특수 문자를 사용하지 않고, 아래 예시대로 일정을 작성해줘
4번의 예시는 아래와 같아
<2024.02.06>
- 세비야 대성당 37.38610100, -5.99220400
- 알카사르 세비야 37.38338500, -5.99051600
- 점심식사 에스피넬리 글로리아 37.39404600, -5.99379500
- 히랄다 탑 37.38603000, -5.99303300
- 스페인 광장 37.37722200, -5.98694400
- 저녁식사 바루로 37.37734300, -5.98742700
- 쇼핑 세비야 엘 코르테 잉글레스 37.38942400, -5.99407200
<2024.02.07>
- 세비야 대성당 37.38610100, -5.99220400
- 알카사르 세비야 37.38338500, -5.99051600
- 점심식사 에스피넬리 글로리아 37.39404600, -5.99379500
- 히랄다 탑 37.38603000, -5.99303300
- 스페인 광장 37.37722200, -5.98694400
- 저녁식사 바루로 37.37734300, -5.98742700
- 쇼핑 세비야 엘 코르테 잉글레스 37.38942400, -5.99407200
<2024.02.08>
- 세비야 대성당 37.38610100, -5.99220400
- 알카사르 세비야 37.38338500, -5.99051600
- 점심식사 에스피넬리 글로리아 37.39404600, -5.99379500
- 히랄다 탑 37.38603000, -5.99303300
- 스페인 광장 37.37722200, -5.98694400
- 저녁식사 바루로 37.37734300, -5.98742700
- 쇼핑 세비야 엘 코르테 잉글레스 37.38942400, -5.99407200
날짜 형식은 반드시 <YYYY.MM.DD> 을 지켜줘.
매일 점심과 저녁은 레스토랑에서 먹을 거니까, 실제로 맛있고 유명한 레스토랑도 일정에 포함시켜줘.
모두가 너의 계획을 기대하고있어.
다른 말은 하지 말고, 오직 일정만 제공해줘""";

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package com.isp.backend.domain.gpt.entity;

import com.isp.backend.domain.gpt.constant.ParsingConstants;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@RequiredArgsConstructor
@Component
Expand All @@ -16,41 +13,53 @@ public class GptScheduleParser {
public List<GptSchedule> parseScheduleText(String scheduleText) {
System.out.println(scheduleText);
List<GptSchedule> schedules = new ArrayList<>();
Pattern datePattern = Pattern.compile(ParsingConstants.DATE_REGEX);
Pattern detailPattern = Pattern.compile("^-\\s*(.*?)(\\d+\\.\\d{1,8}),\\s*(\\d+\\.\\d{1,8})$");

List<String> lines = List.of(scheduleText.split(ParsingConstants.NEW_LINE_REGEX));
List<GptScheduleDetail> currentScheduleDetail = new ArrayList<>();
String currentDate = "";

for (String line : lines) {
Matcher dateMatcher = datePattern.matcher(line);
if (dateMatcher.find()) {
if (!currentDate.isEmpty() && !currentScheduleDetail.isEmpty()) {
schedules.add(new GptSchedule(currentDate, currentScheduleDetail));
currentScheduleDetail = new ArrayList<>();

String[] entries = scheduleText.split("<");

for (String entry : entries) {
if (entry.trim().isEmpty()) continue;

String[] lines = entry.split("\n");
String date = lines[0].trim().replace(">", "");

List<GptScheduleDetail> scheduleDetails = new ArrayList<>();

for (int i = 1; i < lines.length; i++) {
String line = lines[i].trim();
if (line.isEmpty()) continue;

String[] parts = line.split(" ");
StringBuilder detail = new StringBuilder();
double latitude = 0.0;
double longitude = 0.0;

for (int j = 0; j < parts.length; j++) {
try {
if (j == parts.length - 2) {
latitude = Double.parseDouble(parts[j].replace(",", ""));
} else if (j == parts.length - 1) {
longitude = Double.parseDouble(parts[j]);
} else {
if (!detail.isEmpty()) detail.append(" ");
detail.append(parts[j]);
}
} catch (NumberFormatException e) {
if (!detail.isEmpty()) detail.append(" ");
detail.append(parts[j]);
}
}
currentDate = dateMatcher.group(0);
} else if (!line.trim().isEmpty()) {
Matcher detailMatcher = detailPattern.matcher(line.trim());
if (detailMatcher.find()) {
String detail = detailMatcher.group(1).trim();
Double latitude = formatCoordinate(Double.valueOf(detailMatcher.group(2)));
Double longitude = formatCoordinate(Double.valueOf(detailMatcher.group(3)));
Coordinate coordinate = new Coordinate(latitude, longitude);
currentScheduleDetail.add(new GptScheduleDetail(detail, coordinate));

String detailString = detail.toString().trim();
if (detailString.startsWith("-")) {
detailString = detailString.substring(1).trim();
}

scheduleDetails.add(new GptScheduleDetail(detailString, new Coordinate(latitude, longitude)));
}
}

if (!currentDate.isEmpty() && !currentScheduleDetail.isEmpty()) {
schedules.add(new GptSchedule(currentDate, currentScheduleDetail));
schedules.add(new GptSchedule(date, scheduleDetails));
}

return schedules;
}

private Double formatCoordinate(Double coordinate) {
return Double.valueOf(String.format("%.8f", coordinate));
}
}

0 comments on commit 10fa401

Please sign in to comment.