전체 흐름은 다음과 같다.
① 문서를 읽는다.
② 문장을 적절히 분할한다.
③ 분할한 문장을 임베딩한다. (숫자로 변경한다)
④ 벡터 DB에 내용을 저장한다.
⑤ 언어모델을 생성한다.
⑥ 프롬프트를 작성한다.
⑦ 프롬프트에 필요한 답변을 벡터 DB에서 찾는다.
⑧ 체인을 실행한다.
이 흐름대로만 실행해야 하는 것은 아니다.
3. RAG
- 우리 회사의 문서(pdf, txt, html)를 기반으로 LLM 모델이 답변할 수 있도록 하는 구조
- db에 있는 내용을 기반으로도 답변 가능 (쿼리를 날려서)
from langchain_community.document_loaders import PyMuPDFLoader
loader = PyMuPDFLoader('pdf 이름')
docs = loader.load() # pdf 문서를 읽는다
docs # Document 객체 배열 반환, 랭체인에서는 하나의 문장을 Document 클래스로 표현
# 배열 요소(특정 페이지)의 내용을 확인
docs[0].page_content
# 문맥을 유지하면서 문장을 적절히 분할
text_splitter = RecursiveCharacterTextSplitter.from_language(
chunk_size = 1000, chunk_overlap = 100, language=Language.MARKDOWN
)
splits = text_splitter.split_documents(docs)
# 1000개의 chunk 사이즈 문장을 임베딩 해줘야 한다 (숫자로 변경해서 vector db에 저장)
# 분할한 문장을 벡터화해 db에 저장한다
embeddings = UpstageEmbeddings(model='solar-embedding-1-large')
vector_store = Chroma(embedding_function=embeddings) # 벡터화할 모델 지정
vector_store.add_documents(splits)
# db에서 가져오기
# 벡터 db에서 검색한 자료
retriever = vector_store.as_retriever()
retriever.invoke('어떤 키워드')
# 체인 생성 (모델에 질문을 날릴 수 있다)
# (1) 언어 모델
llm = ChatUpstage(model='solar-pro')
# (2) prompt template 설정
prompt_template = PromptTemplate.from_template(
'''
아래의 컨텍스트에서 가장 적합한 답변을 작성해 주세요.
만약 관련 정보가 없다면 그냥 모른다고 답변해 주세요.
---
질문: {question}
---
컨텍스트: {context}
'''
) # 내부 문서로 답변을 하게끔 프롬프트 작성
query = "Meta는 AI Agent에 대한 어떤 서비스를 운영하고 있나요?"
context = retriever.invoke(query)
context_docs = context[0].page_content
# (5) 체인 실행
chain.invoke({"question": query, "context": context_docs})
print(result)
'AI' 카테고리의 다른 글
[AI] 랭체인 활용 챗봇 코드 첨부 (0) | 2025.04.28 |
---|