ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LlamaIndex] LLM 설정 및 사용
    카테고리 없음 2024. 1. 16. 12:26

    ○ LLM 설정 및 기본 사용

    LLM 기반 애플리케이션을 구축할 때 먼저 고려해야 할 사항은 어떤 LLM을 사용할 것인가입니다. 필요한 경우 둘 이상의 LLM을 사용할 수도 있습니다. LLM은 파이프라인의 여러 단계에서 사용될 수 있으나 대표적으로는 아래와 같이 사용 됩니다.

    • Indexing 중에 LLM을 사용하여 텍스트를 Embeding 하는 경우
    • 질의문과 관련된 문서를 바탕으로 답변 생성
    • 그 외 텍스트를 요약하여 Indexing 하거나 문서를 분할 할때 Semantic 한 정보를 고려하여 분할 할 경우 등

    일반적으로 LLM은 아래 코드처럼 인스턴스화 하여 'ServiceContext'에 보내는 방법으로 사용합니다.

    from llama_index.llms import OpenAI
    from llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
    
    llm = OpenAI(temperature=0.1, model="gpt-4")
    service_context = ServiceContext.from_defaults(llm=llm)
    
    documents = SimpleDirectoryReader("data").load_data()
    index = VectorStoreIndex.from_documents(
        documents, service_context=service_context
    )

     

     

    ○ 이용가능한 LLM 

    LlamaIndex에서는 OpenAI, Anthropic, Hugging Face, PaLM 등 다양한 LLM의 이용이 가능합니다. 이용가능한 LLM의 Full List는 아래 링크에서 제공합니다.

    https://docs.llamaindex.ai/en/stable/module_guides/models/llms/modules.html

     

    ○ 다양한 사용 예시

    # LLM을 독립적으로 사용

    from llama_index.llms import OpenAI
    
    # non-streaming
    resp = OpenAI().complete("Paul Graham is ")
    print(resp)
    
    # using streaming endpoint
    from llama_index.llms import OpenAI
    
    llm = OpenAI()
    resp = llm.stream_complete("Paul Graham is ")
    for delta in resp:
        print(delta, end="")

     

    #  LLM Parameter 정의

    # 출력토큰 개수 변경 등 Parameter 조정
    
    from llama_index import (
        KeywordTableIndex,
        SimpleDirectoryReader,
        ServiceContext,
    )
    from llama_index.llms import OpenAI
    
    documents = SimpleDirectoryReader("data").load_data()
    
    # define LLM
    llm = OpenAI(temperature=0, model="text-davinci-002", max_tokens=512)
    service_context = ServiceContext.from_defaults(llm=llm)

     

    #  HuggingFace LM 사용

    import torch
    from llama_index.llms import HuggingFaceLLM
    
    llm = HuggingFaceLLM(
        context_window=4096,
        max_new_tokens=256,
        generate_kwargs={"temperature": 0.7, "do_sample": False},
        system_prompt=system_prompt,
        query_wrapper_prompt=query_wrapper_prompt,
        tokenizer_name="StabilityAI/stablelm-tuned-alpha-3b",
        model_name="StabilityAI/stablelm-tuned-alpha-3b",
        device_map="auto",
        stopping_ids=[50278, 50279, 50277, 1, 0],
        tokenizer_kwargs={"max_length": 4096},
        # uncomment this if using CUDA to reduce memory usage
        # model_kwargs={"torch_dtype": torch.float16}
    )
    service_context = ServiceContext.from_defaults(
        chunk_size=1024,
        llm=llm,
    )

     

     

    ○ Embeding Model 설정 및 사용 예시

    LlamaIndex에서는 Embeding을 사용하여 텍스트를 Vector로 표현합니다. 기본적으로는 OpenAI의 text-embedding-ada-002을 사용하나, 선택할 수 있는 임베딩 모델이 많이 있습니다.또한 Langchain이 제공하는 모든 임베딩 모델을 지원 하고 자체 임베딩을 구현하기 위해 쉽게 확장할 수 있는 기본 클래스도 제공하고 있습니다.

     

    # 기본적인 설정 방법

    LLM 설정과 같은 방법으로 인스턴스화 하여 'ServiceContext'에 보내는 방법으로 사용합니다.

    from llama_index import ServiceContext, VectorStoreIndex, SimpleDirectoryReader
    from llama_index.embeddings import OpenAIEmbedding
    
    embed_model = OpenAIEmbedding(embed_batch_size=42) #batch_size 수정가능, 기본값은 10
    service_context = ServiceContext.from_defaults(embed_model=embed_model)

     

    # Embeding을 독립적으로 사용

    embeddings = embed_model.get_text_embedding(
        "It is raining cats and dogs here!"
    )

     

    # Lanchain Embeding Model 사용

    LlamaIndex는 Lanchain이 제공하는 모든 임베딩을 지원합니다. 아래 예시는 Lanchain Embeding 클래스를 사용하여 Hugging Face에서 모델을 로드합니다.

    from langchain.embeddings.huggingface import HuggingFaceBgeEmbeddings
    from llama_index import ServiceContext
    
    embed_model = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-base-en")
    
    service_context = ServiceContext.from_defaults(embed_model=embed_model)

     

    # 사용자 정의 Embeding Model  사용

    아래 예시에서는 'Instructor Embeding'을 사용하여 사용자 정의 Embeding 클래스를 구현합니다. 'Instructor Embeding'은 Embeding 할 텍스트 도메인에 대한 지침을 제공하여 전문화된 주제의 텍스트를 Embeding 할때 유용합니다.

    from typing import Any, List
    from InstructorEmbedding import INSTRUCTOR
    from llama_index.embeddings.base import BaseEmbedding
    
    
    class InstructorEmbeddings(BaseEmbedding):
        def __init__(
            self,
            instructor_model_name: str = "hkunlp/instructor-large",
            instruction: str = "Represent the Computer Science documentation or question:",
            **kwargs: Any,
        ) -> None:
            self._model = INSTRUCTOR(instructor_model_name)
            self._instruction = instruction
            super().__init__(**kwargs)
    
            def _get_query_embedding(self, query: str) -> List[float]:
                embeddings = self._model.encode([[self._instruction, query]])
                return embeddings[0]
    
            def _get_text_embedding(self, text: str) -> List[float]:
                embeddings = self._model.encode([[self._instruction, text]])
                return embeddings[0]
    
            def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
                embeddings = self._model.encode(
                    [[self._instruction, text] for text in texts]
                )
                return embeddings

     

    # Source 출처

    https://docs.llamaindex.ai/en/stable/index.html

Designed by Tistory.