커스터마이즈 가능한 HTTP 클라이언트
커스터마이즈 가능한 HTTP 클라이언트
LLM 제공자 API를 호출할 때 사용하는 HTTP 클라이언트를 바꾸고 싶을 때가 있어요. 예컨대 커스텀 SSL 컨텍스트를 넣거나 타임아웃·연결 방식을 바꾸려는 경우죠. LangChain4j의 일부 모듈(현재 OpenAI와 Ollama)은 이런 커스터마이징을 지원해요.
langchain4j-http-client 모듈은 HttpClient SPI를 구현하는데, 이걸로 해당 모듈들이 LLM 제공자의 REST API를 호출해요. 즉 기반이 되는 HTTP 클라이언트를 커스터마이즈할 수 있고, HttpClient SPI를 구현하는 한 어떤 HTTP 클라이언트든 통합할 수 있어요.
현재 다음과 같은 기본 제공 구현이 있어요.
JdkHttpClient—langchain4j-http-client-jdk모듈 소속. 지원 모듈(예:langchain4j-open-ai)을 쓸 때 기본으로 사용돼요.SpringRestClient—langchain4j-http-client-spring-boot4-restclient/langchain4j-http-client-spring-restclient모듈 소속. 지원 모듈의 Spring Boot starter(예:langchain4j-open-ai-spring-boot4-starter/langchain4j-open-ai-spring-boot-starter)를 쓸 때 기본으로 사용돼요.ApacheHttpClient—langchain4j-http-client-apache모듈 소속.OkHttpClient—langchain4j-http-client-okhttp모듈 소속.
JDK HttpClient 커스터마이징
HttpClient.Builder httpClientBuilder = HttpClient.newBuilder()
.sslContext(...);
JdkHttpClientBuilder jdkHttpClientBuilder = JdkHttpClient.builder()
.httpClientBuilder(httpClientBuilder);
OpenAiChatModel model = OpenAiChatModel.builder()
.httpClientBuilder(jdkHttpClientBuilder)
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
:::note
HttpClient 구현은 논블로킹 대응물도 제공할 수 있어요. 단일 응답용 executeAsync(...)와, 파싱된 server-sent events의 cold Flow.Publisher용 stream(...)이죠. 기본 제공되는 JDK·OkHttp·Apache 클라이언트는 둘 다 구현해요. Non-blocking and Reactive를 참고하세요.
:::
Spring RestClient 커스터마이징
RestClient.Builder restClientBuilder = RestClient.builder()
.requestFactory(new HttpComponentsClientHttpRequestFactory());
SpringRestClientBuilder springRestClientBuilder = SpringRestClient.builder()
.restClientBuilder(restClientBuilder)
.streamingRequestExecutor(new VirtualThreadTaskExecutor());
OpenAiChatModel model = OpenAiChatModel.builder()
.httpClientBuilder(springRestClientBuilder)
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
Apache HttpClient 커스터마이징
org.apache.hc.client5.http.impl.classic.HttpClientBuilder httpClientBuilder = org.apache.hc.client5.http.impl.classic.HttpClientBuilder.create();
ApacheHttpClientBuilder apacheHttpClientBuilder = ApacheHttpClient.builder()
.httpClientBuilder(httpClientBuilder);
OpenAiChatModel model = OpenAiChatModel.builder()
.httpClientBuilder(apacheHttpClientBuilder)
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();