AI/LLM

Langchain

아나엘 2025. 2. 10. 11:26

langchain 생태계? 그림 참고하기

 

1, 2의 retriever 차이? community는 langchain이 다른걸 활용할 수 있게 의존성을 떨어뜨린 것. 외부 검색도구 등의 tool 활용가능하도록.

langchain - chains, agents, retrieval strategies

langchain-community: model IO(model, prompt, example selector, output parser), retrieval(retriever, document loader, vector store, text splitter, embedding model), Agent tooling(tool, toolkit)

langchain core: LCEL 지원

 

 

 

RunnableWithMessageHistory 로 multi turn 구현 가능

from langchain_core.chat_history import (
    BaseChatMessageHistory,
    InMemoryChatMessageHistory,
)
from langchain_core.runnables.history import RunnableWithMessageHistory

store = {}

# session_id를 key로 삼아 dictionary에 저장
# value 값에는 chat history를 저장
def get_session_history(session_id: str) -> BaseChatMessageHistory:
    #입력된 session id에 대한 정보가 store에 ㅇ벗다면 inmemorychat어쩌구객체 생성해서 이번대화넣음
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    #해당 세션id의 대화 history 반환
    return store[session_id]

# get_session_history를 통해 우리가 관리하는 
#얘는 체인으로 결합할 수 없어서.. RunnableWith활용해서 대화기록 자동으로 처리.. runnable한 객체 생성
with_message_history = RunnableWithMessageHistory(llm, get_session_history)
#대화형 모델을 실행하는 동시에 히스토리도 관리

 

-> session_id로 관리함

config = {"configurable": {"session_id": "random123"}}

response = with_message_history.invoke(
    [HumanMessage(content="내 이름이 뭐라고 했는지 기억나?")],
    config=config,
)

response.content

 

 

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(pages)
#문단/문장/단어/청크 크기까지 줄어들때까지 계속 자름. 재귀적으로. 단순 글자수로 자르는 것보다 문맥 유지하기에 낫군
반응형