제퍼넷 로고

LlamaIndex 및 Llama 2-Chat을 사용하여 지식 기반 대화형 애플리케이션 구축 | 아마존 웹 서비스

시간

방대한 양의 텍스트에서 정확하고 통찰력 있는 답변을 얻는 것은 대규모 언어 모델(LLM)이 지원하는 흥미로운 기능입니다. LLM 애플리케이션을 구축할 때 모델에 관련 컨텍스트를 제공하기 위해 외부 데이터 소스를 연결하고 쿼리해야 하는 경우가 많습니다. 널리 사용되는 접근 방식 중 하나는 RAG(검색 증강 생성)를 사용하여 복잡한 정보를 이해하고 쿼리에 자연스러운 응답을 제공하는 Q&A 시스템을 만드는 것입니다. RAG를 사용하면 모델이 방대한 지식 기반을 활용하고 챗봇 및 엔터프라이즈 검색 도우미와 같은 애플리케이션에 인간과 같은 대화를 제공할 수 있습니다.

이번 포스팅에서는 힘을 활용하는 방법에 대해 알아보겠습니다. 라마 인덱스, 라마 2-70B-채팅랭체인 강력한 Q&A 애플리케이션을 구축합니다. 이러한 최첨단 기술을 사용하면 텍스트 말뭉치를 수집하고, 중요한 지식을 색인화하고, 사용자의 질문에 정확하고 명확하게 답변하는 텍스트를 생성할 수 있습니다.

라마 2-70B-채팅

Llama 2-70B-Chat은 선도적인 모델과 경쟁하는 강력한 LLM입니다. 2022조 개의 텍스트 토큰에 대해 사전 훈련되었으며 Meta에서 사용자에 대한 채팅 지원에 사용하도록 의도되었습니다. 사전 학습 데이터는 공개적으로 사용 가능한 데이터를 기반으로 하며 2023년 XNUMX월에 종료되며 미세 조정 데이터는 XNUMX년 XNUMX월에 종료됩니다. 모델의 학습 프로세스, 안전 고려 사항, 학습 및 의도된 용도에 대한 자세한 내용은 논문을 참조하세요. Llama 2: 개방형 기반 및 미세 조정된 채팅 모델. Llama 2 모델은 다음에서 사용할 수 있습니다. Amazon SageMaker 점프스타트 빠르고 간단한 배포를 위해.

라마 인덱스

라마 인덱스 LLM 애플리케이션 구축을 가능하게 하는 데이터 프레임워크입니다. 다양한 소스 및 형식(PDF, 문서, API, SQL 등)으로 기존 데이터를 수집하기 위한 데이터 커넥터를 제공하는 도구를 제공합니다. 데이터가 데이터베이스에 저장되어 있든 PDF에 저장되어 있든 LlamaIndex를 사용하면 해당 데이터를 LLM에 쉽게 사용할 수 있습니다. 이 게시물에서 설명하는 것처럼 LlamaIndex API를 사용하면 데이터 액세스가 쉬워지고 강력한 사용자 정의 LLM 애플리케이션 및 워크플로를 만들 수 있습니다.

LLM을 실험하고 구축하는 경우 강력한 프레임워크를 제공하여 LLM 기반 애플리케이션의 개발 및 배포를 단순화하는 LangChain에 익숙할 것입니다. LangChain과 유사하게 LlamaIndex는 데이터 커넥터, 데이터 인덱스, 엔진 및 데이터 에이전트를 포함한 다양한 도구는 물론 도구 및 관찰 가능성, 추적 및 평가와 같은 애플리케이션 통합을 제공합니다. LlamaIndex는 데이터와 강력한 LLM 간의 격차를 해소하고 사용자 친화적인 기능으로 데이터 작업을 간소화하는 데 중점을 둡니다. LlamaIndex는 LLM 쿼리 및 관련 문서 검색을 위한 간단한 인터페이스를 제공하므로 RAG와 같은 검색 애플리케이션 구축을 위해 특별히 설계되고 최적화되었습니다.

솔루션 개요

이 게시물에서는 LlamaIndex와 LLM을 사용하여 RAG 기반 애플리케이션을 만드는 방법을 보여줍니다. 다음 다이어그램은 다음 섹션에 설명된 이 솔루션의 단계별 아키텍처를 보여줍니다.

RAG는 ​​정보 검색과 자연어 생성을 결합하여 보다 통찰력 있는 응답을 생성합니다. 메시지가 표시되면 RAG는 먼저 텍스트 말뭉치를 검색하여 입력과 가장 관련성이 높은 예를 검색합니다. 응답 생성 중에 모델은 이러한 예를 고려하여 기능을 강화합니다. 검색된 관련 구절을 통합함으로써 RAG 응답은 기본 생성 모델에 비해 더 사실적이고 일관되며 맥락과 일치하는 경향이 있습니다. 이 검색-생성 프레임워크는 검색과 생성의 장점을 모두 활용하여 순수 자동 회귀 대화 모델에서 발생할 수 있는 반복 및 컨텍스트 부족과 같은 문제를 해결하는 데 도움이 됩니다. RAG는 ​​상황에 맞는 고품질 응답을 갖춘 대화 에이전트 및 AI 도우미를 구축하기 위한 효과적인 접근 방식을 도입합니다.

솔루션 구축은 다음 단계로 구성됩니다.

  1. 설정 아마존 세이지 메이커 스튜디오 개발 환경으로 선택하고 필요한 종속성을 설치합니다.
  2. Amazon SageMaker JumpStart 허브에서 임베딩 모델을 배포합니다.
  3. 보도 자료를 다운로드하여 외부 지식 기반으로 활용하세요.
  4. 프롬프트에 추가 컨텍스트를 쿼리하고 추가할 수 있도록 보도 자료에서 색인을 구축합니다.
  5. 기술 자료를 쿼리합니다.
  6. LlamaIndex 및 LangChain 에이전트를 사용하여 Q&A 애플리케이션을 구축합니다.

이 게시물의 모든 코드는 다음에서 사용할 수 있습니다. GitHub 레포.

사전 조건

이 예에서는 SageMaker 도메인과 적절한 AWS 계정이 필요합니다. AWS 자격 증명 및 액세스 관리 (IAM) 권한. 계정 설정 지침은 다음을 참조하세요. AWS 계정 생성. 아직 SageMaker 도메인이 없다면 다음을 참조하세요. Amazon SageMaker 도메인 개요를 살펴보세요. 이번 포스팅에서는 AmazonSageMaker 전체 액세스 역할. 프로덕션 환경에서는 이 자격 증명을 사용하지 않는 것이 좋습니다. 대신, 최소 권한 권한이 있는 역할을 생성하고 사용해야 합니다. 또한 사용 방법을 탐색할 수도 있습니다. Amazon SageMaker 역할 관리자 SageMaker 콘솔을 통해 직접 일반적인 기계 학습 요구 사항에 대한 페르소나 기반 IAM 역할을 구축하고 관리합니다.

또한 최소한 다음 인스턴스 크기에 액세스해야 합니다.

  • ml.g5.2xlarge 배포 시 엔드포인트 사용을 위해 포옹 얼굴 GPT-J 텍스트 임베딩 모델
  • ml.g5.48xlarge Llama 2-Chat 모델 엔드포인트 배포 시 엔드포인트 사용

할당량을 늘리려면 다음을 참조하세요. 할당량 증가 요청.

SageMaker JumpStart를 사용하여 GPT-J 임베딩 모델 배포

이 섹션에서는 SageMaker JumpStart 모델을 배포할 때 두 가지 옵션을 제공합니다. 제공된 코드를 사용하여 코드 기반 배포를 사용하거나 SageMaker JumpStart 사용자 인터페이스(UI)를 사용할 수 있습니다.

SageMaker Python SDK를 사용하여 배포

다음과 같이 SageMaker Python SDK를 사용하여 LLM을 배포할 수 있습니다. 암호 저장소에서 사용 가능합니다. 다음 단계를 완료하세요.

  1. 다음을 사용하여 임베딩 모델 배포에 사용할 인스턴스 크기를 설정합니다. instance_type = "ml.g5.2xlarge"
  2. 임베딩에 사용할 모델의 ID를 찾습니다. SageMaker JumpStart에서는 다음과 같이 식별됩니다. model_id = "huggingface-textembedding-gpt-j-6b-fp16"
  3. 사전 학습된 모델 컨테이너를 검색하고 추론을 위해 배포합니다.

SageMaker는 임베딩 모델이 성공적으로 배포되면 모델 엔드포인트의 이름과 다음 메시지를 반환합니다.

SageMaker Studio에서 SageMaker JumpStart를 사용하여 배포

Studio에서 SageMaker JumpStart를 사용하여 모델을 배포하려면 다음 단계를 완료하십시오.

  1. SageMaker Studio 콘솔의 탐색 창에서 JumpStart를 선택합니다.
  2. GPT-J 6B Embedding FP16 모델을 검색하고 선택합니다.
  3. 배포를 선택하고 배포 구성을 사용자 지정합니다.
  4. 이 예에서는 SageMaker JumpStart에서 제안하는 기본 인스턴스인 ml.g5.2xlarge 인스턴스가 필요합니다.
  5. 배포를 다시 선택하여 엔드포인트를 생성합니다.

엔드포인트가 서비스되기까지 약 5~10분이 소요됩니다.

임베딩 모델을 배포한 후 SageMaker API와 LangChain 통합을 사용하려면 입력(원시 텍스트)을 처리하고 모델을 사용하여 이를 임베딩으로 변환하는 함수를 생성해야 합니다. 이 작업은 다음과 같은 클래스를 생성하여 수행합니다. ContentHandler는 입력 데이터의 JSON을 사용하고 텍스트 임베딩의 JSON을 반환합니다. class ContentHandler(EmbeddingsContentHandler).

모델 엔드포인트 이름을 ContentHandler 텍스트를 변환하고 임베딩을 반환하는 함수:

embeddings = SagemakerEndpointEmbeddings(endpoint_name='huggingface-textembedding-gpt-j-6b-fp16', region_name= aws_region, content_handler=emb_content_handler).

SDK 출력이나 SageMaker JumpStart UI의 배포 세부 정보에서 엔드포인트 이름을 찾을 수 있습니다.

테스트할 수 있는 것은 ContentHandler 일부 원시 텍스트를 입력하고 다음을 실행하면 함수와 엔드포인트가 예상대로 작동합니다. embeddings.embed_query(text) 기능. 제공된 예제를 사용할 수 있습니다 text = "Hi! It's time for the beach" 또는 자신만의 텍스트를 사용해 보세요.

SageMaker JumpStart를 사용하여 Llama 2-Chat 배포 및 테스트

이제 사용자와 대화형 대화를 나눌 수 있는 모델을 배포할 수 있습니다. 이 경우에는 다음을 통해 식별되는 Llama 2채팅 모델 중 하나를 선택합니다.

my_model = JumpStartModel(model_id = "meta-textgeneration-llama-2-70b-f")

모델은 다음을 사용하여 실시간 엔드포인트에 배포되어야 합니다. predictor = my_model.deploy(). SageMaker는 모델의 엔드포인트 이름을 반환합니다. endpoint_name 나중에 참조할 변수입니다.

당신은 print_dialogue 채팅 모델에 입력을 보내고 출력 응답을 받는 함수입니다. 페이로드에는 다음을 포함한 모델의 하이퍼파라미터가 포함됩니다.

  • max_new_tokens – 모델이 출력에서 ​​생성할 수 있는 최대 토큰 수를 나타냅니다.
  • top_p – 출력을 생성할 때 모델이 보유할 수 있는 토큰의 누적 확률을 나타냅니다.
  • 온도 – 모델에 의해 생성된 출력의 무작위성을 나타냅니다. 온도가 0보다 크거나 1과 같으면 무작위성 수준이 증가하는 반면, 온도가 0이면 가능성이 가장 높은 토큰이 생성됩니다.

사용 사례에 따라 하이퍼파라미터를 선택하고 적절하게 테스트해야 합니다. Llama 제품군과 같은 모델의 경우 EULA(최종 사용자 사용권 계약)를 읽고 동의했음을 나타내는 추가 매개변수를 포함해야 합니다.

response = predictor.predict(payload, custom_attributes='accept_eula=true')

모델을 테스트하려면 입력 페이로드의 콘텐츠 섹션을 바꾸세요. "content": "what is the recipe of mayonnaise?". 자신만의 텍스트 값을 사용하고 하이퍼파라미터를 업데이트하여 이를 더 잘 이해할 수 있습니다.

임베딩 모델 배포와 유사하게 SageMaker JumpStart UI를 사용하여 Llama-70B-Chat을 배포할 수 있습니다.

  1. SageMaker Studio 콘솔에서 다음을 선택합니다. 점프 시작 탐색 창에서
  2. 검색하고 선택 Llama-2-70b-Chat model
  3. EULA에 동의하고 선택하세요. 배포, 기본 인스턴스를 다시 사용

임베딩 모델과 유사하게 채팅 모델의 입력 및 출력에 대한 콘텐츠 핸들러 템플릿을 생성하여 LangChain 통합을 사용할 수 있습니다. 이 경우 입력을 사용자로부터 오는 입력으로 정의하고 해당 입력이 system prompt. 그만큼 system prompt 특정 사용 사례에 대해 사용자를 지원하는 역할을 모델에 알려줍니다.

그런 다음 모델을 호출할 때 앞서 언급한 하이퍼 매개변수 및 사용자 정의 속성(EULA 승인) 외에도 이 콘텐츠 핸들러가 전달됩니다. 다음 코드를 사용하여 이러한 모든 속성을 구문 분석합니다.

llm = SagemakerEndpoint(
        endpoint_name=endpoint_name,
        region_name="us-east-1",
        model_kwargs={"max_new_tokens":500, "top_p": 0.1, "temperature": 0.4, "return_full_text": False},
        content_handler=content_handler,
        endpoint_kwargs = {"CustomAttributes": "accept_eula=true"}
    )

엔드포인트를 사용할 수 있게 되면 예상대로 작동하는지 테스트할 수 있습니다. 업데이트할 수 있습니다 llm("what is amazon sagemaker?") 당신의 텍스트로. 또한 특정 항목을 정의해야 합니다. ContentHandler 그림과 같이 LangChain을 사용하여 LLM을 호출합니다. 암호 다음 코드 조각은 다음과 같습니다.

class ContentHandler(LLMContentHandler):
    content_type = "application/json"
    accepts = "application/json"
    def transform_input(self, prompt: str, model_kwargs: dict) -> bytes:
            payload = {
                "inputs": [
                    [
                        {
                            "role": "system",
                            "content": system_prompt,
                        },
                        {"role": "user", "content": prompt},
                    ],
                ],
                "parameters": model_kwargs,
            }
            input_str = json.dumps(
                payload,
            )
            return input_str.encode("utf-8")
   
    def transform_output(self, output: bytes) -> str:
            response_json = json.loads(output.read().decode("utf-8"))
            content = response_json[0]["generation"]["content"]
            return content
        
content_handler = ContentHandler()

LlamaIndex를 사용하여 RAG 구축

계속하려면 LlamaIndex를 설치하여 RAG 애플리케이션을 생성하세요. pip를 사용하여 LlamaIndex를 설치할 수 있습니다. pip install llama_index

먼저 인덱싱을 위해 LlamaIndex에 데이터(기술 자료)를 로드해야 합니다. 여기에는 몇 가지 단계가 포함됩니다.

  1. 데이터 로더를 선택하세요:

LlamaIndex는 다음에서 사용할 수 있는 다양한 데이터 커넥터를 제공합니다. 라마허브 JSON, CSV, 텍스트 파일과 같은 일반적인 데이터 유형은 물론 기타 데이터 소스에 대해 다양한 데이터 세트를 수집할 수 있습니다. 이번 포스팅에서는 SimpleDirectoryReader 코드에 표시된 대로 몇 가지 PDF 파일을 수집합니다. 우리의 데이터 샘플은 PDF 버전의 Amazon 보도 자료 2개입니다. 보도 자료 코드 저장소의 폴더입니다. PDF를 로드한 후 11개 요소 목록으로 변환된 것을 볼 수 있습니다.

문서를 직접 로드하는 대신 문서를 숨길 수도 있습니다. Document 반대하다 Node 개체를 인덱스로 보내기 전에 개체입니다. 전체를 보내는 것 사이의 선택 Document 객체를 인덱스로 변환하거나 문서를 Node 색인을 생성하기 전의 객체는 특정 사용 사례와 데이터 구조에 따라 다릅니다. 노드 접근 방식은 일반적으로 전체 문서가 아닌 문서의 특정 부분을 분리하고 검색하려는 긴 문서에 적합한 선택입니다. 자세한 내용은 다음을 참조하세요. 문서/노드.

  1. 로더를 인스턴스화하고 문서를 로드합니다.

이 단계에서는 로더 클래스와 숨겨진 파일 무시 여부와 같은 필요한 구성을 초기화합니다. 자세한 내용은 다음을 참조하세요. SimpleDirectoryReader.

  1. 로더에게 전화하세요 load_data 소스 파일과 데이터를 구문 분석하고 이를 LlamaIndex Document 개체로 변환하여 인덱싱 및 쿼리할 수 있는 방법을 제공합니다. 다음 코드를 사용하면 LlamaIndex의 인덱싱 및 검색 기능을 사용하여 전체 텍스트 검색을 위한 데이터 수집 및 준비를 완료할 수 있습니다.
docs = SimpleDirectoryReader(input_dir="pressrelease").load_data()

  1. 색인을 작성하십시오.

LlamaIndex의 주요 기능은 문서나 노드로 표시되는 데이터에 대해 조직화된 인덱스를 구성하는 기능입니다. 인덱싱은 데이터에 대한 효율적인 쿼리를 용이하게 합니다. 기본 메모리 내 벡터 저장소와 정의된 설정 구성을 사용하여 인덱스를 생성합니다. 라마지수 설정 LlamaIndex 애플리케이션에서 인덱싱 및 쿼리 작업에 일반적으로 사용되는 리소스와 설정을 제공하는 구성 개체입니다. 이는 싱글톤 개체 역할을 하므로 전역 구성을 설정할 수 있는 동시에 특정 구성 요소를 사용하는 인터페이스(예: LLM, 임베딩 모델)에 직접 전달하여 로컬에서 특정 구성 요소를 재정의할 수도 있습니다. 특정 구성요소가 명시적으로 제공되지 않으면 LlamaIndex 프레임워크는 다음에 정의된 설정으로 대체됩니다. Settings 개체를 전역 기본값으로 사용합니다. LangChain과 함께 임베딩 및 LLM 모델을 사용하고 Settings 우리는 설치해야 해 llama_index.embeddings.langchainllama_index.llms.langchain. 우리는 Settings 다음 코드와 같은 객체:

Settings.embed_model = LangchainEmbedding(embeddings)
Settings.llm = LangChainLLM(llm)

기본적으로, VectorStoreIndex 인메모리를 사용한다 SimpleVectorStore 이는 기본 저장소 컨텍스트의 일부로 초기화됩니다. 실제 사용 사례에서는 다음과 같은 외부 벡터 저장소에 연결해야 하는 경우가 많습니다. 아마존 오픈서치 서비스. 자세한 내용은 Amazon OpenSearch 서버리스용 벡터 엔진.

index = VectorStoreIndex.from_documents(docs, service_context=service_context)

이제 다음을 사용하여 문서에 대해 Q&A를 실행할 수 있습니다. 쿼리_엔진 LlamaIndex에서. 그렇게 하려면 앞서 쿼리용으로 생성한 인덱스를 전달하고 질문하세요. 쿼리 엔진은 데이터 쿼리를 위한 일반 인터페이스입니다. 자연어 쿼리를 입력으로 사용하고 풍부한 응답을 반환합니다. 쿼리 엔진은 일반적으로 하나 이상의 쿼리 엔진 위에 구축됩니다. 색인 사용 리트리버.

query_engine = index.as_query_engine() print(query_engine.query("Since migrating to AWS in May, how much in operational cost Yellow.ai has reduced?"))

RAG 솔루션이 제공된 문서에서 정답을 검색할 수 있음을 확인할 수 있습니다.

According to the provided information, Yellow.ai has reduced its operational costs by 20% since migrating to AWS in May

LangChain 도구 및 에이전트 사용

Loader 수업. 로더는 데이터를 LlamaIndex에 로드하거나 이후에 도구로 로드하도록 설계되었습니다. LangChain 에이전트. 이를 통해 애플리케이션의 일부로 사용할 수 있는 더 많은 기능과 유연성을 얻을 수 있습니다. 당신은 당신의 수단 LangChain 에이전트 클래스에서. 도구에 전달하는 함수는 LlamaIndex를 사용하여 문서에 구축한 색인을 쿼리합니다.

tools = [
    Tool(
        name="Pressrelease",
        func=lambda q: str(index.as_query_engine().query(q)),
        description="useful pressreleases for answering relevnat questions",
        return_direct=True,
    ),
]

그런 다음 RAG 구현에 사용하려는 올바른 유형의 에이전트를 선택합니다. 이 경우 다음을 사용합니다. chat-zero-shot-react-description 대리인. 이 에이전트를 통해 LLM은 사용 가능한 도구(이 시나리오에서는 지식 기반에 대한 RAG)를 사용하여 응답을 제공합니다. 그런 다음 도구, LLM 및 에이전트 유형을 전달하여 에이전트를 초기화합니다.

agent= initialize_agent(tools, llm, agent="chat-zero-shot-react-description", verbose=True)

상담원이 진행하는 모습을 볼 수 있습니다. thoughts, actions observation , 도구를 사용합니다(이 시나리오에서는 색인화된 문서 쿼리). 결과를 반환합니다.

'According to the provided press release, Yellow.ai has reduced its operational costs by 20%, driven performance improvements by 15%, and cut infrastructure costs by 10% since migrating to AWS. However, the specific cost savings from the migration are not mentioned in the provided information. It only states that the company has been able to reinvest the savings into innovation and AI research and development.'

함께 제공되는 엔드투엔드 구현 코드를 찾을 수 있습니다. GitHub 레포.

정리

불필요한 비용을 피하기 위해 다음 코드 조각이나 Amazon JumpStart UI를 통해 리소스를 정리할 수 있습니다.

Boto3 SDK를 사용하려면 다음 코드를 사용하여 텍스트 포함 모델 끝점, 텍스트 생성 모델 끝점 및 끝점 구성을 삭제합니다.

client = boto3.client('sagemaker', region_name=aws_region)
client.delete_endpoint(EndpointName=endpoint_name)
client.delete_endpoint_config(EndpointConfigName=endpoint_configuration)

SageMaker 콘솔을 사용하려면 다음 단계를 완료하십시오.

  1. SageMaker 콘솔의 탐색 창에 있는 추론 아래에서 엔드포인트를 선택합니다.
  2. 임베딩 및 텍스트 생성 엔드포인트를 검색합니다.
  3. 엔드포인트 세부 정보 페이지에서 삭제를 선택합니다.
  4. 삭제를 다시 선택하여 확인합니다.

결론

검색에 초점을 맞춘 사용 사례를 위해 LlamaIndex는 유연한 기능을 제공합니다. LLM의 인덱싱 및 검색에 탁월하여 데이터를 심층적으로 탐색할 수 있는 강력한 도구입니다. LlamaIndex를 사용하면 정리된 데이터 인덱스를 생성하고, 다양한 LLM을 사용하고, 더 나은 LLM 성능을 위해 데이터를 늘리고, 자연어로 데이터를 쿼리할 수 있습니다.

이 게시물에서는 몇 가지 주요 LlamaIndex 개념과 기능을 보여주었습니다. 우리는 임베딩을 위해 GPT-J를 사용하고 RAG 애플리케이션을 구축하기 위해 LLM으로 Llama 2-Chat을 사용했지만 대신 적합한 모델을 사용할 수 있습니다. SageMaker JumpStart에서 사용 가능한 광범위한 모델을 탐색할 수 있습니다.

또한 LlamaIndex가 LangChain과 같은 다른 프레임워크와 데이터를 연결, 색인화, 검색 및 통합하는 강력하고 유연한 도구를 제공할 수 있는 방법도 보여주었습니다. LlamaIndex 통합과 LangChain을 사용하면 더욱 강력하고 다재다능하며 통찰력 있는 LLM 애플리케이션을 구축할 수 있습니다.


저자에 관하여

로미나 샤리푸어 박사 Amazon Web Services(AWS)의 수석 기계 학습 및 인공 지능 솔루션 설계자입니다. 그녀는 ML 및 AI의 발전을 통해 구현된 혁신적인 엔드투엔드 솔루션의 설계 및 구현을 주도하는 데 10년 이상을 보냈습니다. Romina의 관심 분야는 자연어 처리, 대규모 언어 모델, MLOps입니다.

니콜 핀토 호주 시드니에 본사를 둔 AI/ML 전문 솔루션 설계자입니다. 의료 및 금융 서비스에 대한 그녀의 배경은 고객 문제 해결에 대한 독특한 관점을 제공합니다. 그녀는 기계 학습을 통해 고객을 지원하고 STEM 분야의 차세대 여성에게 힘을 실어주는 데 열정을 갖고 있습니다.

spot_img

최신 인텔리전스

spot_img