1. RAG
Retrieval-Augmented Generation
'검색해서(되찾아와서)' 증강된 생성
이에 반해 RAG는 때로 사용자가 제공하는 외부 정보를 참조해서 질문에 대해 더욱 유용하고 신뢰할 수 있는 답변을 생성한다
- RAG의 세 가지 기본 요소는 인덱싱, 검색(Retrieval), 생성
- 이 단계에서 특히 인덱싱은 데이터베이스에서 정보를 불러오는 절차의 하나로서 '문서준비→문서분할→임베딩(Embedding, 분할된 문서는 벡터 수치로 변환하여 수학적 공간에 위치시킴. 유사한 내용의 문서들은 비슷한 위치에 존재)→벡터저장'의 순서를 거친다.
- 따라서 이와 같은 과정을 거쳐 AI 코드에 따라 쿼리에 맞는 정보 검색 및 생성이 가능하도록 한다.
2. HyDE
Hypothetical Document Embeddings
가상의 문서 임베딩
- HyDE(Hypothetical Document Embeddings)는 질문-쿼리 번역 기술로, 초기 질문을 쿼리에 적합한 가상의 문서로 변환하여, 더 나은 검색 적합성을 도출한다.
* 가상의 문서(Hyphthetical document): 실제로 존재하지 않는, 이용자의 질문을 기반으로 강화-생성된 새로운 질문 - RAG가 외부 데이터의 벡터화-저장 및 반환에 초점이 맞춰져있다면 HyDE는 프로세스 내에서 질문을 효율적으로 사용할 수 있다.
- 구체적으로, RAG chain에서는 질문-문서 간 임베딩, 수치화하여 둘 간의 유사성을 찾는다. 하지만 문서는 매우 큰 덩어리이며 질문은 짧고 어색하게 작성되는 경우가 많아 한번에 효율적으로 매칭되기 어렵다. 따라서 HyDE는 질문 자체를 문서에 맞게 재생성한다.
from Multi Query to HyDE
3. Peak 적용
①고객사의 정보입력 단계에서의 질문 생성, 챗봇 답변 가능(RAG, HyDE)
- 고객사의 정보 등록과 동시에 이를 RAG의 과정에서 임베딩, 벡터화
- HyDE를 통해 후 제시할 고객사에 대한 가상적 정보를 생성 가능
- 챗봇은 DB에서 정보 기반 문서, FAQ 및 정책 등을 고객 정보와 관련시켜 생성
②가상의 이상적인 B2B 문서(프로필) 생성(HyDE)
- 고객사가 어떤 요청을 하기 전에 고객사의 산업과 규모, 실적 등을 기반으로 가상의 이상적인 파트너사를 생성.
- 파트너사 추천 및 예상 질문, 대화 생성의 '기준점' 제공.
- 이는 백터화되어 저장되며 따라서 이전, 이후에 등록된 가까운 회사의 정보와 비슷한 공간에 매칭
"이상적인 파트너사는 사용자 경험(UX/UI) 개선 기술을 보유하고, 지난 2년간 월간 활성 사용자(MAU)가 연평균 20% 이상 성장한 중견 규모의 온라인 플랫폼 기업으로, 유럽 및 아시아 시장에도 진출해 있고, 모바일 커머스 기능을 성공적으로 운영한 사례를 가지고 있는 기업.”
③예비 질문을 통한 요구사항 정교화(RAG, HyDE)
- 고객사가 스스로의 니즈를 밝히기 전에 이를 구체화 시키기 위해 물어볼 “예비 질문”을 생성
- 이에 대한 답변을 통해 이후 검색 범위나 필터링 조건에 반영 가능
“고객님께서 찾으시는 파트너 기업의 연간 매출 규모 제한이 필요할까요?”
“유럽 시장에만 국한된 파트너를 원하시는지, 아니면 글로벌 기업도 고려하시는지 궁금합니다.”
“지속 가능성 인증 중 특정 국제 표준(예: ISO 14001)을 보유한 기업을 더 선호하시나요?”
#### INDEXING ####
# Load Documents
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer #Beutifulsoup 통해 파싱하여 로드
docs = loader.load()
#### 1. Split
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs) #로드된 데이터의 문자를 1000으로 분리.
#### 2. Embed
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
#벡터 저장소에 임베딩(분리된 문자 조각을 계산할 수 있게끔 저장). 컨텍스트 윈도우의 제한에 따라.
#이후 임베딩-벡터화된 문자는 수치적 비교에 따라 쿼리에 맞춘 retrival이 가능하게 됨.
retriever = vectorstore.as_retriever()
=> 언제든 Retrival 할 수 있는 상태로 저장
#### RETRIEVAL and GENERATION ####
#### 1. Prompt
prompt = hub.pull("rlm/rag-prompt")
#### 2. LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
#OpenAI임베딩 모델 이용 가능
#### 3. Post-processing
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
#### 4. Chain
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
#### 5. Question
rag_chain.invoke("What is Task Decomposition?")
'DAta 이론' 카테고리의 다른 글
[이론 정리]<AI 시대의 프로그래머> 요약: 프롬프트 엔지니어링의 이해와 방법 (1) | 2024.12.20 |
---|---|
[데이터 분석 알아보기] 2-1. 데이터 시각화는 무엇이고 왜 필요할까? (0) | 2024.08.15 |
[데이터 분석 알아보기] 2-1. 머신러닝_ML의 의미와 종류 (0) | 2024.08.12 |
[데이터 분석 알아보기] 2-2.직관적인 데이터 시각화 만들기 (1) | 2024.08.09 |
[데이터 분석 알아보기] 1-1. 데이터 전처리_사용자 행동 데이터 분석 (0) | 2024.08.06 |