티스토리 뷰

반응형

 

지난 시간엔 LagnChain의 LangGraph를 만들어보았다.

 

이번에는 LangChain에서 Agent를 만들어보자. 예제 코드는 여기에서 볼 수 있다.

Agent는 간단하다. 지난 시간에 배운 LangGraph에서 분기 노드를 자동으로 결정해주는 녀석이라고 보면 된다.

 

Tool이라고 하는 각각의 함수들이 존재하고, 해당 Tool을 사용하면서 사용자의 답을 해결할 때까지 지속적으로 돌아간다.

Web상의 정보도 찾을 수 있고, PDF에서의 정보도 찾을 수 있다. 다만 이 Tool을 질문 Query에 따라 자동으로 Agent가 결정하는 형식이다.

 

Tools 정의하기

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
    chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()

 

다음과 같이 튜토리얼의 한 부분을 가져와보았다.

 

위의 코드는 retriever를 정의한다. 이 정의한 retriever를 agent가 사용할 수 있도록 tool로 만들어준다.

from langchain.tools.retriever import create_retriever_tool
from langchain.tools import tool
from langchain.utilities import SerpAPIWrapper
from langchain.chains import LLMMathChain

retriever_tool = create_retriever_tool(
    retriever,
    "langsmith_search", #표현할 이름
    "Search for information about LangSmith. For any questions about LangSmith, you must use this tool!",)

@tool("math")
def math(query : str) -> str:
    """useful for when you need to answer questions about math"""
    llm_math_chain = LLMMathChain(llm=llm, verbose=True)
    return llm_math_chain.run(query)

#참조 https://api.python.langchain.com/en/latest/tools/langchain_core.tools.create_retriever_tool.html
# retriever (BaseRetriever) –
# name (str) –
# description (str) –
# document_prompt (Optional[BasePromptTemplate]) –
# document_separator (str) –

tools = [retriever_tool, math]

 

두번째 예시처럼, 사용자 정의 Tool을 만들 수도 있다.

사용자 정의 Tool을 만들면, tool 에너테이터로 감싸줘야 한다.

그렇게 만들어서 tools로 넣는다.

 

템플릿 생성하기

from langchain.prompts import PromptTemplate, MessagesPlaceholder, ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate

# 각 템플릿을 생성합니다
system_prompt = SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], template='You are a helpful assistant'))
human_prompt = HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], template='{input}'))
chat_history_placeholder = MessagesPlaceholder(variable_name='chat_history', optional=True)
agent_scratchpad_placeholder = MessagesPlaceholder(variable_name='agent_scratchpad')

# 이들을 ChatPromptTemplate에 통합합니다
chat_prompt = ChatPromptTemplate.from_messages([
    system_prompt,
    chat_history_placeholder,
    human_prompt,
    agent_scratchpad_placeholder
])

# 생성된 chat_prompt를 이제 사용할 수 있습니다.

 

여기서는 agent가 쓸 prompt를 정의해준다.

ChatPromptTemplate 형식처럼 쓰면 된다. 어차피 agent를 만들고, excuter로 한 번 더 감싸줄 것이기에 이렇게 만들어도 괜찮다.

from langchain.agents import create_tool_calling_agent
from langchain.agents import AgentExecutor

agent = create_tool_calling_agent(llm, tools, chat_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

 

create_tool_calling은 agent chain의 개념을 만들어주는 것이고, agnet_executor는 해당하는 에이전트가 실행 가능하게 만든다.

 

이렇게 하고 실행하면?

 

math와 관련된 query를 넣었을 때는 LLMMAthChain이,

아니라면 retriever가 수행된다.

 

이렇게 간단하게 RAG Agent를 만들어볼 수 있다.

 

reference : https://python.langchain.com/v0.1/docs/modules/agents/quick_start/

반응형