티스토리 뷰
지난 시간엔 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/