-
[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 출처