데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      OpenLab - OpenLLM, Llama-2 7B, FAISS, LangChain 활용한 RAG 구현

      sejinoh80 24.07.04
      1,500 1 0
      DEVOTEE 요약
      OpenLLM 스터디 5차 오프라인 모임에서는 RAG 챗봇의 Pre/Post Retriever 코드 구현과 이상 시간 지연 문제를 논의했습니다. 이후 RAG 챗봇의 주요 컴포넌트를 설명하며, 특히 Remote LLM 서버 설정 및 코드 예제를 공유했습니다. 성능 테스트에서 현재 설정한 LLM이 제대로 동작함을 확인했으며, 앞으로 개선할 사항으로 Multi-query retriever 및 GPU 환경에서의 성능 테스트, 그리고 Ragas 프레임워크 통합을 계획하고 있습니다.
      DEVOTEE 추천 블로그

      OpenLLM 스터디 모임 경과를 정리하면서 현재까지 구현된 RAG 챗봇 내용을 함께 공유드립니다.


      스터디 모임 경과

      - 주제 : OpenLLM 스터디 5차 오프라인 모임

      - 일시 : 7/3 20:00 ~ 21:00

      - 장소 : 판교사옥

      - 참석 : 멤버 6명 중 4명

      [+] 7명에서 1명 탈퇴(1명:취업)

      - 스터디 내용

      1) RAG 에서 Pre/Post Retriever 코드 구현 공유 및 의견 교환

      2) 특이점 토의

      • ollama 로 모델이 배포되지 않은 경우 vllm 사용

      • pre/post retriever 부분에서 시간 지연이 큰 경우 정상동작하는 다른 멤버의 코드 참고

      • langchain 과 LlamaIndex 중 langchain 의 평가가 좋지 않은 것으로 보이지만 개념 이해를 위해 langchain 사용 가능

      3) 6차 스터디 종료 준비

      • 개인별로 업무에서 적용할 RAG 챗봇 개념 공유

      • 완성된 챗봇 초안 코드 공유

      • 코드에 대한 의견 공유


      OpenLLM 스터디 4차 과제

      OpenLLM 스터디 4차 과제를 수행하였습니다. 구현에 적용한 RAG 컴포넌트 들은 다음과 같습니다.

      • LLM - llama-2-7b-chat.Q4_K_M.gguf

      • Embedding model - BAAI/bge-m3

      • Rerank model - Dongjin-kr/ko-reranker

      • Vector search library - FAISS

      • Orchestration tool - LangChain

      • Chat UI - Streamlit

      • Embedding 자료 - Nexo_quickguide.pdf (현대자동차 웹 사이트에서 다운로드 받음)

      • OS - Windows 11

      • LLM Inference - CPU

      • LLM Server - LangServe, FastAPI, Uvicorn 활용해 분리

      • python - 3.8.19 (conda 환경)

      • python package - requirements.txt 첨부함


      Streamlit Client - run_rag_rerank.py

      기존 코드 동일하며, 아래 사항을 추가하였습니다.

      from langserve import RemoteRunnable
      
      # Request query to Remote LLM using FastAPI
      def generate_response_remote(query):    
          # single-query retriever 셋팅    
          retriever = load_embedding_singlequery()
          
          #Set-up remote LLM    
          llm = RemoteRunnable(url="http://localhost:8000/llm")
          template = """Use the following pieces of information to answer the user's question.    
          If you don't know the answer, just say that you don't know, don't try to make up an answer.    
          Context: {context}    
          Question: {question}    
          Only return the Korean answer below and nothing else.    
          Korean answer:    """    
          prompt = PromptTemplate(        
              template=template,        
              input_variables=['context', 'question'])
      
          qa_chain = (        
              {            
                  'context': retriever,            
                  'question': RunnablePassthrough()        
              }        
              | prompt        
              | llm    
          )
          
          query = query    
          print('input query: ' + query)    
          #generate answer    
          output = qa_chain.invoke(query)    
          print(output)    
          return output
      
      st.title("OpenLLM AI Chatbot")
      user_input = st.text_input("여기에 질문을 입력하세요")
      if user_input:    
          #response = generate_response(user_input)    
          #response = generate_response_rerank(user_input)    
          #response = generate_response_multiquery(user_input)
          response = generate_response_remote(user_input)
          
          st.write("AI Chatbot 답변: ")    
          st.write(response)


      Remote LLM server - server.py

      여동기 님의 기 구현하신 코드를 많이 참조하였습니다.

      from fastapi import FastAPI
      from fastapi.responses import RedirectResponse
      from langserve import add_routes
      from fastapi.middleware.cors import CORSMiddleware
      from typing import List, Union
      from langserve.pydantic_v1 import BaseModel, Field
      from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
      # user-defined llm.py
      from llm import llm as chain
      
      # Set FastAPI
      app = FastAPI()
      
      # Set Cross-Origin Resource Sharing(CORS) config for FastAPI
      app.add_middleware(    
          CORSMiddleware,    
          allow_origins=["*"],    
          allow_credentials=True,    
          allow_methods=["*"],    
          allow_headers=["*"],    
          expose_headers = ["*"],
      )
      
      # Re-direct to llm server when get event is triggered via chrome browser
      @app.get("/")
      async def redirect_root_to_llmserver():    
          return RedirectResponse("/llm/playground")
      
      # Set routes to call llm with LlamaCpp located in llm.py
      add_routes(app, chain, path="/llm")
      
      if __name__ == "__main__":    
          import uvicorn
      
          uvicorn.run(app, host="0.0.0.0", port=8000)

      아래와 같이 정상적으로 LLM 서버가 구동 됨을 확인하였습니다.

      image.png


      Remote LLM loader - llm.py

      LlamaCpp를 이용하여 llama-2-7b-chat.Q4_K_M.gguf 를 로드하였습니다.

      연산은 CPU로 설정하였습니다.

      추후 Llama-3 8B Instruct 모델로도 테스트 예정입니다.

      from langchain_community.llms import LlamaCpp
      # LLM 경로 지정
      MODEL_PATH = "C:\Work\GenAI\FoundationModel\llama-2–7b-chat\llama-2-7b-chat.Q4_K_M.gguf"
      #MODEL_PATH = "C:\Work\GenAI\FoundationModel\Llama-3-8B-Instruct\Meta-Llama-3-8B-Instruct.Q4_K_M.gguf"
      
      llm = LlamaCpp(    
          model_path=MODEL_PATH,    
          temperature=0.2,    
          top_p=1,    
          max_tokens=3072,    
          verbose=True,    
          n_ctx=3072,
      )


      테스트 결과

      LLM을 분리 후에도 정상적인 결과가 나옴을 확인했습니다.

      그런데 결과가 완전히 일관 되지는 않는 것 같습니다.^^;;

      image.png


      성능은 약 5 tokens per second 나왔습니다.

      image.png


      To Do list

      1. Multi-query retriever 동작 확인

      2. Llama-3로 변경하여 동작 확인

      3. GPU 환경에서의 동작 및 성능 확인

      4. Ragas 프레임워크를 integration 하여 정확도 수치 확인

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      sejinoh80 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기