• LangChain 기본 알아보기

    2025. 12. 24. 12:57

    by. 위지원

    개발환경 준비

    로컬환경,CURSOR, Python 3.11

    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 단위를 초과하여 분할할 수 있음
      • 두 번째의 중복되는 부분 크기가 필요한 이유
        1. 문맥 유지: 문장/단락이 청크 경계에서 잘리지 않도록
        2. 검색 정확도 향상: 경계 근처 정보가  청크 모두에 포함되어 검색 가능성 증가
        3. 의미 보존: 문장이 중간에 잘리지 않도록
    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