-
개발환경 준비
로컬환경,CURSOR, Python 3.11
- KEY 발급 .OpenApi: https://platform.openai.com/api-keys
- .env 환경변수 파일에 설정
OPENAI_API_KEY=LangChain의 주요 RAG 컴포넌트
RAG 프로세스 흐름: 문서 > 컨텍스트 > 프롬포트 > LLM
문서
- LangChain은 다양한 문서로드 라이브러리를 제공( https://docs.langchain.com/oss/python/integrations/document_loaders)
- CONTEXT WINDOW-LLM이 받아들일 수 있는 정보, 단 글자수 제한이 있음 보통 4092토큰 등.. 모델마다 다름
- 텍스트 분할기를 통해 여러개의 청크[문자, 토큰 단위]로 나누어 입력(https://docs.langchain.com/oss/python/integrations/splitters)
- CharacterTextSplitter는 단락이나 문장의 경계가 우선이라 Spilt 단위를 초과하여 분할할 수 있음
- 두 번째의 중복되는 부분 크기가 필요한 이유
- 문맥 유지: 문장/단락이 청크 경계에서 잘리지 않도록
- 검색 정확도 향상: 경계 근처 정보가 두 청크 모두에 포함되어 검색 가능성 증가
- 의미 보존: 문장이 중간에 잘리지 않도록
text_splitter = CharacterTextSplitter( chunk_size=250, # 청크 chunk_overlap=50, # 중복되는 부분 크기 separator='', # 구분자 )임베딩모델 (https://docs.langchain.com/oss/python/integrations/text_embedding)
문서를 Vector로 변환
임베딩 모델의 가장 큰 활용도는 의미도 기반 검색, 거리기반 검색 -> LAG 성능을 결정
embed_documents(texts: List[str]) → List[List[float]]: Embeds a list of documents. embed_query(text: str) → List[float]: Embeds a single query.
현재 embedding model은 총 3개 from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings( model="text-embedding-3-small", )VectorDB
여러가지 Vector Stroe가 있음(https://en.wikipedia.org/wiki/Vector_database) , 그 중 Chroma 사용(https://docs.langchain.com/oss/python/integrations/vectorstores/chroma)

출처: 엔코아 블로그 from langchain_chroma import Chroma vectorstore = Chroma.from_documents( documents=texts, embedding=embeddings, collection_name="langchaintest", persist_directory=db경로, ) result = vectorstore.similarity_search(query)검색기
vector store를 검색도구로 사용 할 수 있음, 질의와 관련된 문서를 검색
retriever = vectorstore.as_retriever(search_kwargs={"k": 2}) relevant_docs = retriever.invoke(query)언어모델(LLM) 🧠(https://docs.langchain.com/oss/python/integrations/chat/openai)
from langchain_openai import ChatOpenAI llm = ChatOpenAI( model="gpt-4o-mini", temperature=0, # 창의성 max_tokens=100, # 생성할 최대 토큰 수 ) #1. 그냥 검색 response = llm.invoke(query) #2. 문서를 함께 주면서 검색요청 query_with_context = f"""{relevant_docs[0].page_content} 해당 문서 참고하여 답변하세요. \n\n{query}""" response = llm.invoke(query_with_context)간단한 RAG 파이프라인 구성하기
- create_stuff_documents_chain: 여러개의 문서를 연결
- create_retrieval_chain: 질문에 관련된 문서 검색하여 질의 답변 제공
from langchain import hub llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0) # 프롬프트 retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat") combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt) rag_chain = create_retrieval_chain(retriever, combine_docs_chain) response = rag_chain.invoke({"input": query}) # 응답의 키체인은 아래와 같은 형태 response.keys() >>dict_keys(['input', 'context', 'answer'])gradio로 간단한 챗봇 구성하기
import gradio as gr def answer_invoke(message, history): response = rag_chain.invoke({"input": message}) return response["answer"] demo = gr.ChatInterface(fn=answer_invoke, title="QA Bot") demo.launch()위 코드를 실행하면 아래와같이 간단한 인터페이스가 실행됨

'✎ 2025년' 카테고리의 다른 글
Cache Fusion (0) 2025.12.31 LangChain - LCEL (0) 2025.12.24 PQ와 QC (4) 2025.06.27 CDC(Change Data Capture) (0) 2025.04.05 프로젝트 성패를 결정짓는 데이터 모델링 이야기 (3) 2025.03.03