-
simple RAG pipelineDEV 2024. 11. 8. 21:10
RAG
Retrieval augmented generation (RAG: 검색 증강 생성)
- 할루시네이션, 학습되지 않은 최신 데이터, 메모리 이슈해결
RAG의 간단한 인덱싱 파이프라인 4단계
- 원본 데이터에서 데이터 로딩(load data)
- 큰 문서를 작은 덩어리(chunking)로 나눕니다.
- 청크를 고밀도 임베딩(embedding)으로 변환
- 임베딩을 벡터 데이터베이스(load vectorDB)에 저장합니다.
RAG 생성 파이프라인의 3가지 구성요소
- 지식베이스에서 정보를 검색하는검색기(retirever)
- 몇 번의 샷 프롬핑, 사고의 사슬 등과 같은 신속한 엔지니어링 기술을 통해 이루어지는 프롬프트 증강
- 최종 응답 생성을 담당하는 LLM
Naive RAG
- data crawl → text를 chunk로 분할 → Transformer Encoder 모델을 사용해 인코딩 후 → vectorDB에 저장
- 런타임에 동일한 인코더 모델을 사용해 유저쿼리를 벡터화, 벡터 유사도 검색을 실행, 상위 k 결과를 찾음
- LLM 프롬프트에 콘텍스트로 제공
TEMPLATE = """ # HUMAN 요청: 주어진 문서를 바탕으로 질문에 답변해줘. # 문서: {context} # 질문: {query} # AI 답변: """ prompt = ChatPromptTemplate.from_template(TEMPLATE) model = Maru() output_parser = StrOutputParser() setup_and_retrieval = RunnableParallel( {"context": retriever, "query": RunnablePassthrough()} ) chain = setup_and_retrieval | prompt | model | output_parser result = chain.invoke("JAX가 뭐야?")
LangChain
- LangChain is a framework for developing applications powered by language models.
- chain = retrieval | prompt | model | output_parser
- LCEL(Langchain Expression Language)
- LCEL makes it easy to build complex chains from basic components.
Load text
문서 로드
loader = TextLoader("state_of_the_union.txt") documents = loader.load()
Chunking text수집한 링크들에 접속해 페이지 내 text load
text를 chunk로 분할
의미를 잃지 않으면서 초기 문서를 일정 크기의 덩어리로 분할하는 것이 중요
청크가 너무 작거나 크면 충분한 콘텍스트 제공이 안되거나, 의미 없는 토큰이 많이 전달될 가능성
RecursiveCharacterTextSplitterhttps://python.langchain.com/docs/how_to/recursive_text_splitter/
This text splitter is the recommended one for generic texttext_splitter = RecursiveCharacterTextSplitter( # Set a really small chunk size, just to show. chunk_size=100, chunk_overlap=20, length_function=len, is_separator_regex=False, )
Search Indexcontext 주입을 위해 검색 기능은 가장 중요한 부분이지만, 간단한 vectorDB retriever 설정을 사용
https://python.langchain.com/docs/integrations/retrievers/self_query/chroma_self_queryembedding = HuggingFaceEmbeddings(model_name="jhgan/ko-sroberta-multitask")vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding) retriever = vectordb.as_retriever( search_kwargs={"k": 4} }
Custom Models
LangChain에서 제공하는 chain, LCEL, LangServe, 여러 구성요소(vectorDB retriver)에 대한 구현을 사용하기 위해
custom model을 ChatModel 인터페이스로 wraping
OpenAI, Google AI 모델들은 구현되어있지만, maru는 구현 되어있지 않기 때문에
https://python.langchain.com/docs/integrations/llms/
https://python.langchain.com/docs/how_to/custom_chat_model/RAG overview
다음글
2024.11.09 - [DEV] - advanced RAG
728x90'DEV' 카테고리의 다른 글
vectorDB 없이 검색api만으로 RAG app만들기 (2) 2024.11.10 advanced RAG (0) 2024.11.09 LLM 기반 챗봇 설계, 구조 변화 (1) 2024.11.07 블록체인과 해쉬 (0) 2024.07.21 미술과 객체지향 프로그래밍의 추상 (0) 2024.01.27