💡

OpenAI APIキー発行から実行まで行う

2023/02/24に公開

OpenAI APIキー発行からAPI実行まで行う

はじめに

  • OpenAI APIは従量課金制のサービスです
  • SpringBootを採用する
  • ConfigurationPropertiesを利用する

OpenAI APIキー発行

OpenAIを利用するためにAPIキーの発行を行います。

OpenAI ログイン認証

  1. Open AIのサイトを表示して、GET STARTEDボタンをクリックする
  2. ログイン認証ページが表示されるので、任意のID認証を実行する
    1. 私はContinue with GoogleでID認証を実施

OpenAI APIキー発行

  1. api-keysのページを表示する
  2. 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