Perplexity Chat

Perplexity Chat

Perplexity AI는 언어 모델을 실시간 검색 기능과 통합하는 독특한 AI 서비스를 제공해요. 다양한 모델을 제공하고 대화형 AI를 위한 스트리밍 응답을 지원해요.

Spring AI는 기존 OpenAI 클라이언트를 재사용해 Perplexity AI와 통합해요. 시작하려면 Perplexity API 키를 얻고, 베이스 URL을 구성하고, 지원되는 모델 중 하나를 선택하면 돼요.

출처: 공식문서

Perplexity API는 OpenAI API와 완전히 호환되지는 않아요. Perplexity는 실시간 웹 검색 결과를 언어 모델 응답과 결합해요. OpenAI와 달리 Perplexity는 toolCalls - function call 메커니즘을 노출하지 않아요. 또한 현재 Perplexity는 멀티모달 메시지를 지원하지 않아요.

사전 준비

  • API 키 생성: 여기에서 API 키를 만들어요. Spring AI 프로젝트의 spring.ai.openai.api-key 속성으로 구성해요.
  • Perplexity 베이스 URL 설정: spring.ai.openai.base-url 속성을 https://api.perplexity.ai로 설정해요.
  • Perplexity 모델 선택: spring.ai.openai.chat.model=<모델명> 속성으로 모델을 지정해요. Supported Models 참고.
  • 채팅 완성 경로 설정: spring.ai.openai.chat.completions-path/chat/completions로 설정해요. chat completions api 참고.

application.properties 파일에 다음과 같이 설정할 수 있어요.

 spring.ai.openai.api-key=<your-perplexity-api-key> spring.ai.openai.base-url=https://api.perplexity.ai spring.ai.openai.chat.model=llama-3.1-sonar-small-128k-online spring.ai.openai.chat.completions-path=/chat/completions

API 키 같은 민감 정보를 다룰 때 보안을 강화하려면 SpEL로 사용자 정의 환경 변수를 참조할 수 있어요.

 # In application.yml spring: ai: openai: api-key: ${PERPLEXITY_API_KEY} base-url: ${PERPLEXITY_BASE_URL} chat: model: ${PERPLEXITY_MODEL} completions-path: ${PERPLEXITY_COMPLETIONS_PATH}
 # In your environment or .env file export PERPLEXITY_API_KEY=<your-perplexity-api-key> export PERPLEXITY_BASE_URL=https://api.perplexity.ai export PERPLEXITY_MODEL=llama-3.1-sonar-small-128k-online export PERPLEXITY_COMPLETIONS_PATH=/chat/completions

애플리케이션 코드에서 프로그래밍 방식으로도 설정할 수 있어요.

 // Retrieve configuration from secure sources or environment variables String apiKey = System.getenv("PERPLEXITY_API_KEY"); String baseUrl = System.getenv("PERPLEXITY_BASE_URL"); String model = System.getenv("PERPLEXITY_MODEL"); String completionsPath = System.getenv("PERPLEXITY_COMPLETIONS_PATH");

저장소와 BOM 추가

Spring AI 아티팩트는 Maven Central과 Spring Snapshot 저장소에 게시돼요. Artifact Repositories 섹션을 참고해 빌드 시스템에 저장소를 추가해요. 의존성 관리를 위해 Spring AI는 일관된 버전을 보장하는 BOM을 제공해요. Dependency Management 섹션을 참고해 추가해요.

자동 설정 (Auto-configuration)

Spring AI의 자동 설정과 스타터 모듈의 아티팩트 이름이 크게 바뀌었어요. 자세한 내용은 업그레이드 노트를 확인해주세요.

Spring AI는 OpenAI 채팅 클라이언트를 위한 Spring Boot 자동 설정을 제공해요. Maven pom.xml이나 Gradle build.gradle에 다음 의존성을 추가하면 돼요.

  • Maven
  • Gradle
 <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency>
 dependencies { implementation 'org.springframework.ai:spring-ai-starter-model-openai' }

채팅 속성 (Chat Properties)

재시도 속성

속성 설명 기본값
spring.ai.retry.max-attempts 최대 재시도 횟수 10
spring.ai.retry.backoff.initial-interval 지수 백오프 정책의 초기 대기 시간 2 sec.
spring.ai.retry.backoff.multiplier 백오프 간격 배수 5
spring.ai.retry.backoff.max-interval 최대 백오프 지속 시간 3 min.
spring.ai.retry.on-client-errors false면 NonTransientAiException을 던지고 4xx 클라이언트 오류에 재시도하지 않음 false
spring.ai.retry.exclude-on-http-codes 재시도를 트리거하지 않아야 하는 HTTP 상태 코드 목록 empty
spring.ai.retry.on-http-codes 재시도를 트리거해야 하는 HTTP 상태 코드 목록 empty

연결 속성

속성 설명 기본값
spring.ai.openai.base-url 연결할 URL. 반드시 https://api.perplexity.ai로 설정해야 함 -
spring.ai.openai.chat.api-key Perplexity API 키 -

구성 속성

채팅 자동 설정의 활성·비활성은 프리픽스 spring.ai.model.chat로 관리해요. 활성화하려면 spring.ai.model.chat=openai(기본값), 비활성화하려면 spring.ai.model.chat=none을 쓰면 돼요.

속성 설명 기본값
spring.ai.model.chat OpenAI 채팅 모델 활성화 openai
spring.ai.openai.chat.model 지원되는 Perplexity 모델 중 하나. 예: llama-3.1-sonar-small-128k-online -
spring.ai.openai.chat.base-url chat 전용 url을 제공하기 위한 spring.ai.openai.base-url의 선택적 재정의. 반드시 https://api.perplexity.ai로 설정해야 함 -
spring.ai.openai.chat.completions-path 반드시 /chat/completions로 설정해야 함 /v1/chat/completions
spring.ai.openai.chat.options.temperature 응답의 무작위성, 0 포함 2 미만 사이. 높을수록 무작위, 낮을수록 결정적. 필수 범위: 0 < x < 2 0.2
spring.ai.openai.chat.options.frequencyPenalty 0보다 큰 곱셈 페널티. 1.0보다 큰 값은 지금까지의 텍스트에서 이미 존재하는 빈도를 기반으로 새 토큰을 페널티해 같은 라인을 그대로 반복할 가능성을 줄임. 1.0은 페널티 없음. presence_penalty와 호환 불가. 필수 범위: x > 0 1
spring.ai.openai.chat.options.maxTokens API가 반환하는 최대 완성 토큰 수. max_tokens에 요청된 총 토큰 수와 messages에 보낸 프롬프트 토큰 수의 합은 요청 모델의 컨텍스트 창 한도를 초과할 수 없음. 미지정 시 모델은 중지 토큰 또는 컨텍스트 창 끝에 도달할 때까지 토큰 생성 -
spring.ai.openai.chat.options.presencePenalty -2.0 ~ 2.0 사이 값. 양수는 새 토큰이 지금까지의 텍스트에 나타나는지 여부를 기준으로 페널티해 새 주제에 대해 말할 가능성을 높임. frequency_penalty와 호환 불가. 필수 범위: -2 < x < 2 0
spring.ai.openai.chat.options.topP nucleus sampling 임계값, 0~1 포함. 각 후속 토큰에 대해 모델은 top_p 확률 질량을 가진 토큰의 결과를 고려. top_k나 top_p 중 하나만 수정 권장. 필수 범위: 0 < x < 1 0.9
spring.ai.openai.chat.options.stream-usage (스트리밍 전용) 전체 요청의 토큰 사용 통계가 담긴 추가 청크를 포함하도록 설정. 이 청크의 choices 필드는 빈 배열이고 다른 모든 청크에도 usage 필드가 포함되지만 null 값 false

spring.ai.openai.chat.options 프리픽스가 붙은 모든 속성은 Prompt 호출에 요청별 runtime 옵션을 추가해 런타임에 덮어쓸 수 있어요.

런타임 옵션

OpenAiChatOptions.java는 사용할 모델, temperature, frequency penalty 같은 모델 구성을 제공해요.

시작 시 기본 옵션은 OpenAiChatModel(api, options) 생성자나 spring.ai.openai.chat.options.* 속성으로 구성해요. 런타임에는 Prompt 호출에 요청별 옵션을 추가해 기본값을 덮어쓸 수 있어요. 특정 요청의 기본 모델과 temperature를 덮어쓰는 예시예요.

 ChatResponse response = chatModel.call( new Prompt( "Generate the names of 5 famous pirates.", OpenAiChatOptions.builder() .model("llama-3.1-sonar-large-128k-online") .temperature(0.4) .build() ));

함수 호출 (Function Calling)

Perplexity는 명시적 함수 호출을 지원하지 않아요. 대신 검색 결과를 응답에 직접 통합해요.

또한 현재 Perplexity API는 미디어 콘텐츠를 지원하지 않아요.

샘플 컨트롤러

start.spring.io에서 새 Spring Boot 프로젝트를 만들고 spring-ai-starter-model-openai를 pom(또는 gradle) 의존성에 추가해요.

src/main/resources 아래에 application.properties 파일을 추가해 OpenAI 채팅 모델을 활성화·구성해요.

 spring.ai.openai.api-key=<PERPLEXITY_API_KEY> spring.ai.openai.base-url=https://api.perplexity.ai spring.ai.openai.chat.completions-path=/chat/completions spring.ai.openai.chat.options.model=llama-3.1-sonar-small-128k-online spring.ai.openai.chat.options.temperature=0.7 # The Perplexity API doesn't support embeddings, so we need to disable it. spring.ai.openai.embedding.enabled=false

api-key를 Perplexity API 키로 바꿔주세요. Perplexity는 임베딩을 지원하지 않으므로 spring.ai.openai.embedding.enabled=false로 임베딩을 꺼두는 점을 주목해요.

이렇게 하면 클래스에 주입할 수 있는 OpenAiChatModel 구현이 만들어져요. 텍스트 생성을 위한 간단한 @Controller 클래스 예시를 볼게요.

 @RestController public class ChatController { private final OpenAiChatModel chatModel; @Autowired public ChatController(OpenAiChatModel chatModel) { this.chatModel = chatModel; } @GetMapping("/ai/generate") public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { return Map.of("generation", this.chatModel.call(message)); } @GetMapping("/ai/generateStream") public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { Prompt prompt = new Prompt(new UserMessage(message)); return this.chatModel.stream(prompt); } }

지원 모델

Perplexity는 검색이 강화된 대화형 AI에 최적화된 여러 모델을 지원해요. 자세한 내용은 Supported Models를 참고해요.

더 알아보기