Using LangChain4j With Micronaut

1. 개요

LangChain4j는 LangChain을 기반으로 한 Java 라이브러리입니다. 우리는 Java 애플리케이션에서 이를 사용하여 LLM과 통합합니다.

Micronaut는 가볍고 모듈식이며 빠른 애플리케이션 구축을 위해 설계된 현대적인 JVM 기반 프레임워크입니다. 우리는 이를 사용하여 최소한의 시작 시간과 메모리 사용량으로 마이크로서비스, 서버리스 애플리케이션 및 클라우드 네이티브 솔루션을 생성합니다. 강력한 의존성 주입과 AOT(사전 컴파일) 기능을 통해 높은 성능과 확장성을 보장합니다. Micronaut에서는 LangChain4j와 훌륭한 통합을 제공하여 두 프레임워크의 장점을 단일 애플리케이션에서 활용할 수 있습니다.

이 튜토리얼에서는 LangChain4j와 Micronaut를 사용하여 AI 기반 애플리케이션을 구축하는 방법을 배우겠습니다. 강력한 도구를 만들어 작업을 자동화하는 것이 얼마나 간단한지 살펴볼 것입니다.

2. 이사 상담 애플리케이션

우리는 LangChain4j와 통합된 Micronaut 애플리케이션을 구축할 것입니다. 이 애플리케이션에서는 잠재적인 이주 국가에 대한 조언을 제공하는 간단한 챗봇을 생성할 것입니다. 챗봇은 제공된 몇 개의 링크에 의존하여 정보를 제공합니다.

애플리케이션은 알림 정보가 있는 국가에 대한 질문에만 응답합니다.

2.1. 의존성

먼저 의존성을 추가해 보겠습니다. 먼저 langchain4j-open-ai 의존성을 추가합니다:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.36.2</version>
</dependency>

이제 Micronaut 관련 의존성을 추가해 보겠습니다:

<dependency>  
    <groupId>io.micronaut.langchain4j</groupId>  
    <artifactId>micronaut-langchain4j-core</artifactId>  
    <version>0.0.1</version>  
</dependency>  
<dependency>  
    <groupId>io.micronaut.langchain4j</groupId>  
    <artifactId>micronaut-langchain4j-openai</artifactId>  
    <version>0.0.1</version>  
</dependency>  

2.2. 설정

OpenAI의 LLM을 사용할 예정이므로, 애플리케이션 YAML 파일에 OpenAI API 키를 추가합시다:

langchain4j:  
  open-ai:  
    api-key: ${OPENAI_API_KEY}

2.3. 이사 상담

이제 챗봇 인터페이스를 생성해 보겠습니다:

public interface RelocationAdvisor {  

    @SystemMessage("""  
      당신은 이사 상담가입니다. 공식적인 어조로 답변하십시오.
      리소스에서 얻은 숫자를 제공하십시오.
      귀하의 지식을 바탕으로 아래 질문에 이관 가능한 국가에 대한 답변을 제공하십시오.
      다음 출처에서만 정보를 가져오십시오:
          - https://www.numbeo.com/cost-of-living/country_result.jsp?country=Spain             
          - https://www.numbeo.com/cost-of-living/country_result.jsp?country=Romania
          및 그 하위 페이지. 그런 다음 대답하십시오. 정보가 없는 경우에는 정확한 텍스트 '해당 국가에 대한 정보가 없습니다'라고 답변하십시오.            
        """)  
    String chat(@UserMessage String question);  
}

RelocationAdvisor 클래스에서는 사용자 메시지를 처리하고 문자열로 모델 응답을 반환하는 chat() 메서드를 정의합니다. 우리는 @SystemMessage 주석을 사용하여 챗봇의 기본 동작을 지정합니다. 이 경우 챗봇이 이사 상담가로 작동하도록 하며 두 개의 특정 링크에서만 국가에 대한 정보를 얻도록 합니다.

2.4. 이사 상담가 팩토리

이제 RelocationAdvisorFactory를 생성해 보겠습니다:

@Factory  
public class RelocationAdvisorFactory {  

    @Value("${langchain4j.open-ai.api-key}")  
    private String apiKey;  

    @Singleton  
    public RelocationAdvisor advisor() {  
        ChatLanguageModel model = OpenAiChatModel.builder()  
          .apiKey(apiKey)  
          .modelName(OpenAiChatModelName.GPT_4_O_MINI)  
          .build();  

       return AiServices.create(RelocationAdvisor.class, model);  
    }  
}

이 팩토리를 사용하여 RelocationAdvisor를 빈으로 생성합니다. 우리는 OpenAiChatModel 빌더를 사용하여 모델 인스턴스를 만들고, 그런 다음 AiServices를 활용하여 인터페이스와 모델 인스턴스를 기반으로 챗봇 인스턴스를 생성합니다.

2.5. 이미 존재하는 소스에 대한 테스트

이제 우리 상담가를 테스트하고 인지하고 있는 국가에 대한 정보를 어떻게 제공하는지 확인해 보겠습니다:

@MicronautTest(rebuildContext = true)  
public class RelocationAdvisorLiveTest {  

    Logger logger = LoggerFactory.getLogger(RelocationAdvisorLiveTest.class);  

    @Inject  
    RelocationAdvisor assistant;  

    @Test  
    void givenAdvisor_whenSendChatMessage_thenExpectedResponseShouldContainInformationAboutRomania() {  
        String response = assistant.chat("Tell me about Romania");  
        logger.info(response);  
        Assertions.assertTrue(response.contains("Romania"));  
    }  

    @Test  
    void givenAdvisor_whenSendChatMessage_thenExpectedResponseShouldContainInformationAboutSpain() {  
        String response = assistant.chat("Tell me about Spain");  
        logger.info(response);  
        Assertions.assertTrue(response.contains("Spain"));  
    }  
}

테스트에서 우리의 RelocationAdvisor 인스턴스를 주입하여 몇 개의 국가에 대해 질문했습니다. 예상대로 응답에 국가 이름이 포함되었습니다.

또한 모델의 응답을 로깅했습니다. 다음과 같습니다:

15:43:47.334 [main] INFO  c.b.m.l.RelocationAdvisorLiveTest - 스페인의 생활비 지수는 58.54로, 다른 국가에 비해 상대적으로 보통입니다.
도심의 원룸 아파트 평균 월세는 약 906.52유로이며, 도심 외부에서는 약 662.68유로입니다...

2.6. 정보 부족에 대한 테스트 케이스

이제 우리의 상담가에게 정보가 없는 국가에 대해 질문해 보겠습니다:

@Test  
void givenAdvisor_whenSendChatMessage_thenExpectedResponseShouldNotContainInformationAboutNorway() {  
    String response = assistant.chat("Tell me about Norway");  
    logger.info(response);  
    Assertions.assertTrue(response.contains("I don't have information about Norway"));  
}

이 경우, 우리의 챗봇은 이 나라에 대한 인식이 없다는 사전 정의된 메시지로 응답했습니다.

3. 결론

이 기사에서는 LangChain4j를 Micronaut와 통합하는 방법을 검토했습니다. 우리가 발견한 것처럼, LLM 기반 기능을 쉽게 달성하고 이를 Micronaut 애플리케이션에 통합하는 것이 간단합니다. 또한, 우리는 AI 서비스를 잘 제어하여 추가 동작을 강화하고 더 복잡한 솔루션을 만들 수 있습니다.

코드는 항상 GitHub에서 확인할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다