티스토리 뷰
반응형
2026.05.08 - [AI] - OpenAI API 연동 - STEP2) 데이터 처리
STEP 3의 핵심은 '대화의 문맥(Context) 유지'입니다.
이전 단계까지의 AI는 단발성 질문에만 답하는 '일회성' 방식이었습니다. 하지만 ChatGPT처럼 대화의 흐름을 기억하게 하려면, 이전 질문과 AI의 답변 전체를 리스트에 담아 다시 보내주는 과정이 필요합니다.
1. 대화 문맥 유지의 원리
OpenAI 서버는 사용자의 이전 대화를 저장해두지 않습니다. 따라서 요청을 보낼 때마다 지금까지의 대화 내역(History)을 모두 messages 배열에 포함시켜야 합니다.
- User: "사과에 대해 알려줘."
- Assistant: "사과는 비타민이 풍부한 과일입니다."
- User: "그게 몸에 왜 좋아?" (여기서 '그게'가 '사과'임을 알기 위해 이전 대화가 필요함)
2. STEP 3 실전 예제 코드
리스트(List)를 사용하여 대화 기록을 누적하고, 이를 지속적으로 전달하는 구조입니다.
Java
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;
public class OpenAI_Step3 {
private static final String API_KEY = System.getenv("OPENAI_KEY");
private static final ObjectMapper mapper = new ObjectMapper();
// 대화 내역을 저장할 리스트 (메모리 역할)
private static final ArrayNode conversationHistory = mapper.createArrayNode();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("🤖 GPT와 대화를 시작합니다. (종료하려면 'exit' 입력)");
// 시스템 역할 부여 (선택사항)
addMessage("system", "너는 유능하고 친절한 Java 멘토야.");
while (true) {
System.out.print("\n나: ");
String userInput = scanner.nextLine();
if ("exit".equalsIgnoreCase(userInput)) break;
// 1. 사용자 질문을 기록에 추가
addMessage("user", userInput);
try {
// 2. 전체 대화 기록을 담아 요청 전송
String responseBody = callOpenAIWithHistory();
// 3. 응답 파싱 및 AI 답변 추출
JsonNode rootNode = mapper.readTree(responseBody);
String aiAnswer = rootNode.path("choices").get(0).path("message").path("content").asText();
System.out.println("GPT: " + aiAnswer);
// 4. AI의 답변도 다음 대화를 위해 기록에 추가
addMessage("assistant", aiAnswer);
} catch (Exception e) {
System.err.println("오류 발생: " + e.getMessage());
}
}
}
// 메시지를 히스토리에 추가하는 헬퍼 메서드
private static void addMessage(String role, String content) {
ObjectNode message = mapper.createObjectNode();
message.put("role", role);
message.put("content", content);
conversationHistory.add(message);
}
public static String callOpenAIWithHistory() throws Exception {
// 전체 히스토리를 포함한 JSON 페이로드 생성
ObjectNode payload = mapper.createObjectNode();
payload.put("model", "gpt-3.5-turbo");
payload.set("messages", conversationHistory);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.openai.com/v1/chat/completions"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + API_KEY)
.POST(HttpRequest.BodyPublishers.ofString(payload.toString()))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
return response.body();
}
}
3. 주요 구현 포인트
- ArrayNode conversationHistory: user, assistant, system의 모든 대화를 순서대로 저장하는 배열입니다.
- 연속성: 사용자가 질문할 때마다 리스트가 길어지며, AI는 이 리스트 전체를 보고 문맥을 파악합니다.
- 역할 분담 (Role):
- system: AI의 성격이나 제약사항을 정의합니다.
- user: 실제 사용자의 입력입니다.
- assistant: 이전에 AI가 했던 답변입니다. AI는 자신이 이전에 뭐라고 했는지 이 정보를 통해 확인합니다.
4. 주의사항: 토큰(Token) 관리
대화가 길어지면 conversationHistory가 비대해집니다. OpenAI API는 한 번에 보낼 수 있는 최대 토큰 양(Context Window)이 정해져 있습니다.
- 대화가 너무 길어지면 가장 오래된 대화부터 리스트에서 삭제(remove(0))하는 로직이 추후 필요할 수 있습니다.
- 토큰이 많아질수록 비용도 증가하므로 효율적인 관리가 중요합니다.
'AI' 카테고리의 다른 글
| AI 시대 주니어 개발자 생존 전략, 구글이 원하는 필수 역량 3가지 (1) | 2026.06.03 |
|---|---|
| AI 코드 분석하는 방법 (1) | 2026.05.16 |
| OpenAI API 연동 - STEP6) 비용최적화 (0) | 2026.05.12 |
| OpenAI API 연동 - STEP5) 음성인식 (0) | 2026.05.12 |
| OpenAI API 연동 - STEP4) 이미지 생성 (0) | 2026.05.12 |
| OpenAI API 연동 - STEP2) 데이터 처리 (0) | 2026.05.12 |
| OpenAI API 연동 - STEP1) 연동하기 기초 (0) | 2026.05.12 |
| LLM(거대 언어 모델)이란 (0) | 2026.05.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- html
- 상속
- 파일처리
- 클래스
- 문제풀이
- 자료구조
- Android
- Java
- 알고리즘
- 아두이노
- C언어
- MySQL
- C++
- String
- C++ 클래스
- 배열
- 벡터
- 데이터베이스
- 파이썬
- c#
- DB연동
- 블루투스
- 안드로이드
- 리스트
- OpenCV
- 정보처리기사
- Class
- 문자열
- C
- 자바
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
글 보관함
반응형
