Spring AI Provides Integration with OpenAI and Azure OpenAI
Spring AI 프로젝트는 SpringOne 컨퍼런스 동안 소개되었으며, Spring의 일반적인 개념을 사용하여 AI 애플리케이션을 생성할 수 있게 해줍니다. 현재 이 프로젝트는 Azure OpenAI와 OpenAI를 AI 백엔드로 통합하고 있습니다. 콘텐츠 생성, 코드 생성, 의미론적 검색, 요약과 같은 사용 사례가 프로젝트에 의해 지원됩니다.
역사적으로, Python은 C와 C++와 같은 언어로 작성된 AI 알고리즘에 빠르게 접근할 수 있도록 자주 사용되었습니다. OpenAI의 ChatGPT와 같은 솔루션에서 사용되는 생성 AI는 HTTP를 통해 사전 훈련된 모델에 접근할 수 있게 해줍니다. 이로 인해 Java와 같은 언어가 AI 알고리즘과 효율적으로 상호 작용할 수 있게 됩니다.
약어 ChatGPT는 Chat Generative Pre-Trained Transformer를 의미하며, 사전 훈련된 모델을 사용합니다. 이로 인해 개발자가 데이터베이스를 사용하는 것과 유사한 방식으로 AI를 사용할 수 있게 됩니다. AI는 더 이상 데이터 과학자가 데이터를 수집하고 모델을 훈련시키는 것을 필요로 하지 않습니다.
이 프로젝트는 SpringOne 컨퍼런스에서 소개되었으며, Spring 프레임워크와 통합하여 AI 애플리케이션을 쉽게 개발할 수 있도록 목표를 두고 있습니다. 주요 내용을 요약하면 다음과 같습니다:
Spring AI 프로젝트
- 소개: SpringOne 컨퍼런스에서 발표됨.
- 목적: Spring의 일반적인 개념을 사용하여 AI 애플리케이션 개발을 쉽게 함.
- 통합: 현재 Azure OpenAI와 OpenAI를 AI 백엔드로 지원함.
- 사용 사례: 콘텐츠 생성, 코드 생성, 의미론적 검색, 요약 등을 지원함.
역사적 맥락
- 파이썬의 역할: 전통적으로 C나 C++로 작성된 AI 알고리즘에 빠르게 접근할 수 있게 함.
- 생성 AI: OpenAI의 ChatGPT와 같은 기술은 HTTP를 통해 사전 훈련된 모델에 접근할 수 있게 해, Java와 같은 다른 언어로도 AI 알고리즘과 효율적으로 상호 작용할 수 있게 함.
ChatGPT
- 약자의 의미: Chat Generative Pre-Trained Transformer(챗 생성 사전 훈련 트랜스포머).
- 사용의 용이성: 사전 훈련된 모델을 사용하여 개발자가 AI를 쉽게 통합할 수 있게 함. 이는 데이터베이스를 사용하는 것과 유사함.
- 데이터 과학자의 필요성 감소: 사전 훈련된 모델을 사용하므로, 데이터 수집과 모델 훈련이 필요 없어 AI 개발 과정이 단순화됨.
Java 개발자들이 AI를 자신들의 애플리케이션에 통합하는 데 있어 매우 흥미로운 발전이라고 할 수 있습니다.
그러나 OpenAI와 Azure OpenAI와 같은 AI 솔루션을 위한 다양한 Java 클라이언트 API는 서로 다르기 때문에, 이러한 솔루션 간에 전환하기가 더 어렵습니다. Spring AI는 Python 라이브러리인 LangChain과 LlamaIndex에서 영감을 받아 이러한 클라이언트 API 위에 추상화 계층을 제공합니다. 이 라이브러리들은 모듈성, 확장성, 다양한 데이터 소스와의 통합과 같은 디자인 가치를 기반으로 하고 있습니다.
Spring AI는 공통 API를 통한 AI 모델과의 통합과 같은 여러 기능을 제공합니다. Spring MVC의 뷰와 유사하게 비교할 수 있는 템플릿을 선택적으로 사용하는 프롬프트(prompt)는 AI 모델과 상호 작용하는 데 사용됩니다. 모델에 대한 호출을 연결하는 것이 지원되며, 더 어려운 문제의 경우 문제를 분해하고 조각별로 해결할 수 있습니다. 출력 파싱은 문자열 출력을 예를 들어 CSV나 JSON으로 변환할 수 있게 해줍니다. 모델은 프로젝트의 FAQ와 같은 사용자 정의 데이터를 사용할 수 있으며, 특정 대화 스타일을 학습할 수 있습니다. 테스트를 통한 답변 평가는 프로젝트의 품질을 유지하는 데 사용될 수 있습니다.
Spring AI는 실험적인 프로젝트로 스냅샷 릴리즈만 있기 때문에, 다음과 같은 저장소를 추가한 후에 사용할 수 있습니다: (저장소 정보가 누락되어 있습니다)
<repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories>
When using OpenAI the following dependency may be used:
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>0.2.0-SNAPSHOT</version> </dependency>
In order to use Azure OpenAI instead of OpenAI, the following dependency may be used:
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> <version>0.2.0-SNAPSHOT</version> </dependency>
대안으로, Spring CLI를 사용하여 새 프로젝트를 생성할 수 있습니다. Spring CLI는 다양한 운영 체제를 위한 바이너리(binaries)를 제공하며, 문서(documentation)에서 더 많은 정보를 찾을 수 있습니다. 다음 명령어는 OpenAI를 위한 새 프로젝트를 생성하는 데 사용될 수 있습니다:
spring boot new ai
spring boot new ai-azure
Spring CLI 시작 가이드(Getting Started)는 Spring AI로 프로젝트를 생성하는 데 대한 더 많은 정보를 제공합니다.
프로젝트가 OpenAI나 Azure OpenAI를 사용하기 전에 API 키를 제공해야 합니다. OpenAI의 경우 API Keys 페이지에서 토큰을 생성할 수 있습니다. 그런 다음 이 토큰은 spring.ai.openai.api-key
속성을 위해 사용 가능해야 하며, 예를 들어 환경 변수를 내보내는 방식으로 설정할 수 있습니다:
export SPRING_AI_OPENAI_API_KEY=<INSERT KEY HERE>
Azure OpenAI의 경우, 엔드포인트와 api-key는 Azure OpenAI Service 섹션에서 가져올 수 있습니다. 그런 다음 이 토큰들은 spring.ai.azure.openai.api-key
와 같은 속성을 위해 사용 가능해야 하며, 예를 들어 환경 변수를 내보내는 방식으로 설정할 수 있습니다:
export SPRING_AI_AZURE_OPENAI_API_KEY=<INSERT KEY HERE> export SPRING_AI_AZURE_OPENAI_ENDPOINT=<INSERT ENDPOINT URL HERE>
이제 이 설정을 사용하여 Azure OpenAI 서비스에 질문을 할 수 있습니다:
AiClient aiClient = new AzureOpenAiClient(); String response = aiClient.generate("What's the answer to the Ultimate Question of Life, the Universe, and Everything?");
실제로, Spring Boot Starter는 AiClient를 생성할 것이며, 이를 통해 단 한 줄의 코드로 AI 모델과 상호 작용할 수 있게 됩니다.
하드 코딩된 질문을 생성하는 대신에, 프롬프트 템플릿을 사용할 수도 있습니다. 먼저 .st 확장자를 가진 파일을 생성해야 합니다. 예를 들어, ‘your-prompt.st’라는 파일을 만들고, 그 안에 ‘topic’이라는 플레이스홀더를 포함한 문장을 넣습니다:
Tell me a fun fact about {topic}
다음으로, AI 모델을 호출할 때 프롬프트 템플릿을 사용할 수 있습니다. 예를 들어, ‘topic’ 템플릿에 ‘developers’라는 값을 제공하는 방식으로 사용할 수 있습니다:
@Bean ApplicationRunner applicationRunner (@Value("classpath:/your-prompt.st) Resource resource, AiClient aiClient) { return args -> { var promptTemplate = new PromptTemplate(resource); var prompt = promptTemplate.create(Map.of("topic", "developers"); var response = aiClient.generate(prompt); System.out.println(response.getGeneration()); }; }
이 프로젝트는 사용자가 모델에 사용자 정의 정보나 데이터를 제공할 수 있게 해줍니다. 예를 들어, 회사 내부 정보인 자주 묻는 질문(FAQs)이나 모델이 생성될 당시에는 사용할 수 없었던 새로운 데이터 등을 제공할 수 있습니다. 관련 정보에 대한 리소스를 정의할 수 있습니다:
@Value("classpath:/myCustomInformation.txt) Resource myCustomInformation;
Then the context may be added as a prompt template:
var prompt = "... {context}...";
Lastly, the context is filled with the provided information:
var promptTemplate = new PromptTemplate( prompt); promptTemplate.create(Map.of("context", myCustomInformation)));
프롬프트 입력은 AI 모델로 전송하기 전에 먼저 검증됩니다. 이렇게 하면 요청 수를 줄이고 따라서 비용을 절감할 수 있습니다.
VMware의 Spring 개발자 옹호자인 Josh Long은 Spring AI 프로젝트의 리더인 Dr. Mark Pollack와 interview 를 진행했으며, 그들은 다양한 가능성을 논의하고 여러 코드 예시(examples.)를 만들었습니다.
참조 문서(reference documentation)에서 더 많은 정보를 찾을 수 있으며, Azure OpenAI에 대한 지침이 있는 워크샵(workshop)도 이용할 수 있습니다. 워크샵 예시는 올바른 의존성을 사용함으로써 Azure OpenAI 대신 OpenAI를 지원하도록 변환될 수 있습니다.