이론 정리

RAG 이론 정리와 활용

철매존 2024. 8. 11. 01:51
728x90
  • chat API
    • API를 이용해 사용자가 모델 제어 가능
      • Messages(주요입력)
        • System : Instruction
        • User : 사용 유저
        • Assistant : 동작 (From System)
      • Request Body
        • max_tokens : 최대 토큰 수 설정가능
        • temperature : 얼마나 정적인 답을 할지(창의성)
        • top_p : 확률 기반으로 예측 단어(토큰) 제한
        • 참고로 temperature 이랑 top_p 동시 조정은 추천되지 않는다.
    • 참고로 요청할 때에 Instruction 을 주면 원하는 응답이 나타나지 않을 수 있다.
      • ex) prompt 요청에서 JSON으로 대답하쇼 하면 JSON이 아닐 수 있다는것.
        • response_format 에서 {”type” : “json_object”} 이렇게 요청하면 항상 JSON 으로 응답한다.
    • chat Completion API 문제점은 이전 대화를 기억하지 못하는것.
      • 그래서 이전 대화를 기억하게 하기 위해서는 그동안의 대화 내용을 다 넣어준다…

RAG (Retrieval Augmented Generation)

  • 답변에 참고할 데이터를 전달해 답변의 정확도를 높이기.

  • 말하자면 미리 답변을 만들거나 계산하는 데에 필요한 외부 데이터들(DB, Document, API 등…)을 넣어두는 것이라 생각하면 된다.

  • 처리 과정

    • Loading (여러 형태의 데이터 불러오기)
      • 문서 : PDF, Text 등 데이터 소스를 포함한 컨테이너
      • 노드 : 소스 문서의 조각(chunk) 으로 가장 작은 데이터 단위
      • 커넥터 : Reader라고 불리며 문서와 노드 구성에 사용된다.
    • Indexing (데이터 정리하기. 주로 임베딩을 사용한다.)
      • index : 로드된 데이터를 Vector DB에 저장. 이 과정에서 데이터 embedding 이 포함된다.
      • Embedding : Word tokens를 LLM에 입력되는 형태의 embedding vector 로 변환한다.
        • 데이터 상 벡터 위치에 따라 유사도 검색.
        • Vector DB
          • 벡터 기반 데이터 저장 및 검색 시스템
            • 유사도 검색, 효율적인 인덱싱, Prompt Engineering
          • APP 에서 쿼링하면, Chroma에서 질문과 유사한 정보들을 선택해서 전달한다.
    • Storing (디스크에 데이터 저장하기.)
      • 위에서 인덱싱한 데이터 저장 (로컬, 서버 등)
    • Querying (추가된 데이터를 다양한 방법으로 LLM 에 전달.)
      • Retrievers : 입력된 데이터를 특정 조건으로 찾아오는 역할을 한다.
    • Evaluating (LLM 응답을 평가하기.)
      • Node Post Processors : RAG 데이터 중 연관성이 적은 데이터를 제거해 비용을 낮추고 정확한 답변을 생성하도록 돕는다.
        • chunk 가 줄어서 비용을 낮출 수 있다.
      • Response : 최종적으로 LLM 에 쿼리를 전달 받은 답변 내용
    • Evaluating
      • Evaluating : LLM 답변이 적절한지 판단한다.
  • Use Cases

    • Query Engines
      • 데이터에 대한 질문을 받는 형태의 E to E pipeline
    • Chat Engines
      • 데이터와 이전 데이터를 기억하는 대화를 위한 E to E pipeline
    • Agents
      • Tools 와 결합해 상호작용이 가능한 자동화된 형태.
      • 더 복잡한 작업 가능
  • Llama-Index

    • RAG를 쉽게 구현할 수 있다.

    • 관련 데이터 등을 미리 Llama-Index 로 보내서 RAG 를 구현할 수 있다.

    • Python code

      # 임베딩 레이어를 정의합니다.
      embed_model = OpenAIEmbedding(
        model="text-embedding-3-small",
      )
      
      documents = SimpleDirectoryReader("/content/drive/MyDrive/mbti").load_data()
      
      vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
      storage_context = StorageContext.from_defaults(vector_store=vector_store)
      
      # 미리 정의된 데이터를 index로 저장하기 위해 정의
      index = VectorStoreIndex.from_documents(
        documents, storage_context=storage_context, embed_model=embed_model,
        transformations=[SentenceSplitter(chunk_size=256)]
      )
      
      from llama_index.core import get_response_synthesizer
      from llama_index.core.retrievers import VectorIndexRetriever
      from llama_index.core.query_engine import RetrieverQueryEngine
      from llama_index.core.postprocessor import SimilarityPostprocessor
      
      # 리트리버 설정 - 실제 데이터 설정용
      retriever = VectorIndexRetriever(
        index=index, # 저장된 문서들을 불러옵니다.
        similarity_top_k=3, # 유사한 문장을 최대 몇 개까지 선택할지 설정합니다.
      )
      
      # 문서를 쿼리와 합쳐주는 합성기를 구현합니다.
      response_synthesizer = get_response_synthesizer()
      
      # 쿼리엔진을 동작해 동작시킵니다.
      query_engine = RetrieverQueryEngine(
        retriever=retriever,
        response_synthesizer=response_synthesizer,
        node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.1)],
      )
  • 위의 방식으로 Llama-index 를 구성하고 활용할 수 있다.

  • 실제 활용은 이렇게 가능


response = query_engine.query(
"당신은 MBTI 분석에 대한 전문적인 지식이 있는 심리 분석가입니다. "
+ "각 사람들의 자기소개서를 기반으로 그들의 성격을 분석하고, 가장 잘 맞는 MBTI를 찾아주세요. "
+ "각 사람의 자기소개서에서 성격적 특징과 행동 패턴을 면밀히 분석하여, 정확한 MBTI 유형을 추론해 주세요."
+ "다른 설명을 해줄 필요는 없고, json 형식인 {\"name\": \"이름\", \"mbti\": \"mbti 값\"} 의 형태로 응답을 돌려줘"

+ "안녕하세요, 저는 사람들이 서로 소통하고 성장할 수 있는 환경을 만드는 것을 좋아하는 김지은입니다. 대학 시절부터 다양한 동아리와 봉사 활동을 통해 리더십을 발휘해 왔으며, 이러한 경험들이 저를 더욱 성장시키고 다른 사람들의 발전에 기여할 수 있도록 도왔습니다. 저는 갈등 상황에서도 중재자 역할을 하며, 각자의 의견을 조화롭게 아우르는 방법을 찾아내는 데 능숙합니다. 사람들 간의 원활한 소통과 긍정적인 변화를 이끌어내는 것이 제 가장 큰 장점이라고 생각합니다."
+ "반갑습니다! 저는 새로운 아이디어를 창출하고 이를 현실로 구현하는 데 큰 열정을 가지고 있는 박준수입니다. 항상 새로운 것을 시도하는 것을 두려워하지 않으며, 이는 저를 항상 동기부여하고 창의적으로 만듭니다. 사람들과의 교류에서 얻은 영감을 바탕으로, 저는 기존의 틀을 깨고 혁신적인 방법을 제시하는 데 자신감이 있습니다. 저의 열정과 창의성을 바탕으로, 어떤 환경에서든 긍정적인 변화를 만들어 가는 데 기여할 수 있습니다."
+ "안녕하십니까, 저는 목표를 설정하고 이를 달성하기 위해 체계적으로 계획을 세우는 것을 좋아하는 이태민입니다. 복잡한 문제를 해결하는 과정에서 리더십을 발휘하여 팀을 성공으로 이끌어온 경험이 많습니다. 저는 논리적이고 체계적인 접근을 통해 프로젝트를 관리하고, 팀원 각자의 잠재력을 최대한 발휘할 수 있도록 돕는 데 탁월한 능력을 가지고 있습니다. 저의 분석적 사고와 전략적 계획이 조직의 성장에 크게 기여할 수 있습니다."
+ "안녕하세요, 저는 비판적 사고와 끊임없는 호기심을 바탕으로 새로운 가능성을 탐구하는 것을 즐기는 조현우입니다. 대화를 통해 다양한 관점을 통합하고, 새로운 아이디어를 실용적인 결과로 전환하는 능력을 지니고 있습니다. 기존의 문제에 대해 창의적인 해결책을 제시하며, 때로는 전혀 예상치 못한 방법으로 목표를 달성하는 데 성공했습니다. 저의 이러한 접근 방식이 팀이나 조직에 새로운 시각을 제공하고, 지속적인 성장을 도모할 수 있습니다."
+ "안녕하세요, 저는 타인과의 관계를 소중히 여기고 이를 통해 상호 성장할 수 있는 방법을 찾는 최유리입니다. 사람들과의 깊은 관계를 형성하고, 그들의 요구에 귀 기울이는 것을 중요하게 생각합니다. 저는 팀 내에서 화합을 이끌고, 모두가 즐겁게 일할 수 있는 분위기를 만드는 데 중점을 둡니다. 이러한 저의 능력은 팀원들이 개인적으로도 직업적으로도 성장할 수 있는 기반이 됩니다."
+ "안녕하세요, 저는 삶을 즐기고 다양한 사람들과 쉽게 친해지는 것을 좋아하는 김수현입니다. 제 열정과 활력은 어디서든 사람들을 끌어들이고, 긍정적인 에너지를 전파하는 데 큰 도움이 됩니다. 이벤트 기획과 실행에서 저의 창의적이고 실용적인 접근 방식이 많은 사람들에게 영감을 주었습니다. 저는 모든 상황에서 긍정적이고 기억에 남는 경험을 만들어내는 능력을 가지고 있습니다."
+ "안녕하십니까, 저는 목표를 설정하고 이를 체계적으로 달성하는 데 능숙한 황민호입니다. 일에 있어서는 항상 정확하고 신속하게 처리하는 것을 중요시하며, 주어진 업무를 효과적으로 관리하는 데 자신 있습니다. 저는 팀이나 조직의 구조를 잘 이해하고 이를 통해 업무 효율성을 극대화할 수 있는 방안을 제시하는 데 강합니다. 저의 이러한 성격은 모든 프로젝트를 성공적으로 이끌 수 있는 기반이 됩니다."
+ "안녕하세요, 저는 직관적이고 적극적으로 문제를 해결하는 것을 좋아하는 이다연입니다. 새로운 도전을 즐기고, 빠르게 변화하는 환경에서도 쉽게 적응합니다. 저는 현장에서 실시간으로 문제를 해결하고, 적극적으로 상황을 주도하는 것에서 큰 만족을 느낍니다. 저의 이러한 특성은 팀이나 조직 내에서 새로운 기회를 식별하고 이를 적극적으로 활용하여 성과를 도출하는 데 큰 도움이 됩니다."
+ "안녕하세요, 저는 김하은입니다. 저는 상황을 꿰뚫어보고 조직의 이익과 화합을 중요시하는 성격을 가지고 있습니다. 타인과의 깊은 연결을 중시하며, 내면의 통찰력을 통해 주변 사람들이 자신의 잠재력을 발견하도록 돕는 것을 좋아합니다. 사람들의 고통을 민감하게 느끼고, 이를 해결하기 위해 노력하는 저의 성향은 팀에서 동료들과 긴밀하게 협력하며 목표를 달성하는 데 큰 도움이 됩니다 ."
+ "저는 이수민입니다. 창의적이고 이상적인 접근을 선호하는 저는 대의를 추구하고 예술적인 활동에 열정을 가지고 있습니다. 진정성을 중요시하며, 사람들과의 깊은 관계를 소중히 여깁니다. 공감 능력이 높고, 항상 열린 마음으로 다른 사람들의 이야기를 듣습니다. 이는 저를 훌륭한 조언자로 만들며, 다른 이들이 자신의 감정을 이해하고 성장할 수 있도록 돕습니다. "
+ "반갑습니다, 박준혁입니다. 전략적 사고와 깊은 분석을 통해 문제를 해결하는 것을 선호합니다. 사람과 시스템의 잠재력을 개선하기 위해 끊임없이 새로운 방법을 모색하며, 복잡한 문제를 효율적으로 해결하는 능력이 탁월합니다. 이러한 접근은 특히 기술 및 연구 분야에서 큰 장점으로 작용하며, 저의 독창적이고 체계적인 사고방식은 항상 팀에 새로운 시각을 제공합니다 ."
+ "안녕하세요, 최예진입니다. 저는 독창적이고 분석적인 사고를 통해 세상을 바라보는 것을 선호합니다. 복잡한 문제에 대한 탁월한 해결 능력을 가지고 있으며, 지식을 깊이 있게 탐구하는 것을 즐깁니다. 저의 이론적 접근 방식은 종종 창의적이고 혁신적인 아이디어로 이어지며, 이는 과학 및 연구 분야에서 특히 유용합니다 ."
+ "안녕하세요, 홍지은입니다. 제 성격은 성실하고 책임감이 강하며, 주변 사람들을 돌보는 것을 중요시합니다. 현실적인 문제 해결에 강하고, 언제나 정확하고 체계적인 접근을 합니다. 이러한 성향은 특히 관리 및 행정 분야에서 저를 뛰어난 직원으로 만들며, 동료들과의 긴밀한 협력을 통해 조직의 목표를 효과적으로 지원합니다 ."
+ "안녕하세요, 저는 김태희입니다. 저는 현재 순간을 즐기고, 예술적 감각을 살려 창의적인 활동에 몰두하는 것을 좋아합니다. 타인과의 관계에서 감정적으로 깊이 있게 연결되며, 주변 환경에 대한 강한 감수성을 가지고 있습니다. 이는 디자인, 예술, 음악 분야에서 저의 잠재력을 발휘하는 데 큰 도움이 됩니다 ."
+ "안녕하세요, 전민수입니다. 저는 체계적이고 조직적인 접근을 선호하며, 모든 작업을 정확하고 효율적으로 수행합니다. 높은 집중력과 뛰어난 기억력을 바탕으로, 복잡한 데이터와 정보를 관리하는 일에서 탁월합니다. 이러한 능력은 회계, 법률, 시스템 관리 분야에서 저를 매우 신뢰할 수 있는 전문가로 만들어 줍니다 ."
+ "반갑습니다, 이도윤입니다. 저는 실용적이고 논리적인 해결책을 찾는 데 능숙하며, 즉흥적이고 탄력적으로 상황에 대처할 수 있는 능력을 가지고 있습니다. 이러한 성향은 특히 기술적인 문제를 해결하거나, 비상 상황에서 빠르게 의사 결정을 내려야 할 때 큰 장점이 됩니다. 저의 독립적이고 자유로운 사고방식은 종종 새로운 아이디어와 혁신적인 접근을 촉진합니다 ."
)

display(Markdown(f"{response}"))

image.png