💡
OpenAI APIキー発行から実行まで行う
OpenAI APIキー発行からAPI実行まで行う
はじめに
- OpenAI APIは従量課金制のサービスです
- SpringBootを採用する
- ConfigurationPropertiesを利用する
OpenAI APIキー発行
OpenAIを利用するためにAPIキーの発行を行います。
OpenAI ログイン認証
-
Open AIのサイトを表示して、
GET STARTED
ボタンをクリックする - ログイン認証ページが表示されるので、任意のID認証を実行する
- 私は
Continue with Google
でID認証を実施
- 私は
OpenAI APIキー発行
- api-keysのページを表示する
-
Create new secret key
ボタンをクリックする
OpenAI API実行
エンドポイント
URI
POST //api.openai.com/v1/completions
Parameters
- Header
Name 説明 Authorization APIキー - Body
Name (例)値 説明 model text-curie-001 採用するmodel prompt OpenAI APIキーを発行して インプットする文章 max_tokens 150 文章の最大単語数 temperature 1.0 0
は確定的な文章を出力する為、同じ文章となるtop_p 1.0 小さくすれば候補が確率の高いものに絞られる frequency_penalty 0.0 presence_penalty 0.6 stop - Responses
{ "choices": [ { "text": "<OpenAIからの返答>" } ] }
build.gradle
追加したdependenciesはlombokとSpringBootのStarterのみです。
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.8'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'open-ai-service'
version = '0.0.1'
sourceCompatibility = '11'
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jersey'
}
application.ymlに設定を追加
- authorization
- OpenAI APIキーを設定
- url
- OpenAI URLを設定
open.ai.authorization:
authorization: Bearer sk-XXXXXXXXXXXXXXXXXXXXX
url: https://api.openai.com/v1/completions
open.ai:
model: text-curie-001
maxTokens: 150
temperature: 1.0
topP: 1.0
frequencyPenalty: 0.0
presencePenalty: 0.6
設定値を保持
application.ymlに指定した、設定値を取得する。
アプリケーションが起動時に値が設定されます。
@Data
@Component
@ConfigurationProperties(prefix="open.ai.authorization")
public class OpenAiConfig {
private String authorization;
private String url;
}
model classの追加
Request object
application.yml
から設定値を取得
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix="open.ai")
public class CompletionsRequest {
private String model;
private String prompt;
@JsonProperty("max_tokens")
private int maxTokens;
private double temperature;
@JsonProperty("top_p")
private double topP;
@JsonProperty("frequency_penalty")
private double frequencyPenalty;
@JsonProperty("presence_penalty")
private double presencePenalty;
private String[] stop;
}
Responses object
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CompletionsResponses {
private List<CompletionsResponsesDetail> choices;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class CompletionsResponsesDetail {
private String text;
}
Service classの追加
@Service
public class CompletionsService {
@Autowired
private OpenAiConfig openAiAuthorizationConfig;
@Autowired
private CompletionsRequest completionsRequest;
public CompletionsResponses get(String prompt) {
completionsRequest.setPrompt(prompt);
HttpEntity<CompletionsRequest> entity = new HttpEntity<>(completionsRequest, getHttpHeaders());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<CompletionsResponses> respons = restTemplate.exchange(openAiAuthorizationConfig.getUrl(), HttpMethod.POST, entity,
CompletionsResponses.class);
return respons.getBody();
}
private HttpHeaders getHttpHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Authorization", openAiAuthorizationConfig.getAuthorization());
return headers;
}
}
RestController classの追加
Request URIはGET /api/completionsとする
- URI
GET /api/completions - Parameters
Name 説明 prompt インプットする文章
@RestController
@RequestMapping("api")
public class OpenAiController {
@Autowired
private CompletionsService completionsService;
@RequestMapping(value="completions", method=RequestMethod.GET)
public CompletionsResponses completions(@RequestParam(name = "prompt") String prompt) {
return completionsService.get(prompt);
}
}
感想
SpringBootのConfigurationPropertiesを使ってみたが、簡単に値をバインドすることができた。
次回はWebフロントの実装を行ってみようと思う
フロント実装の記事を書きました。
Discussion