파워풀한 자동화 작업을 위한 LangChain 에이전트 사용 방법
Published on
언어 모델과 자동화의 매혹적인 세계에서 LangChain 에이전트는 혁신의 나침반이 되어 개발자와 기술 애호가들에게 과학소설에서 온 듯한 복잡하고 첨단적인 자동화 작업을 만들 수 있는 기회를 제공합니다. LangChain 에이전트의 세계에 뛰어들고자 하지만 어디서부터 시작해야 할지 모르는 경우, 여기서 당신을 위한 가이드를 제공합니다. 이 가이드는 그 과정을 해체하여 접근 가능하고 간단하게 만들어 줄 것입니다. 그러니 커피 한 잔을 따라주시고, 함께 이 흥미로운 여정을 떠나봅시다.
LangChain 에이전트 사용 방법: 퀵 스타트
에이전트 프레임워크를 가장 잘 이해하기 위해서, 온라인에서 검색하는 데 사용할 도구와 우리가 인덱스에 로드한 특정 데이터를 검색하는 데 사용할 도구가 있는 에이전트를 구축해 보겠습니다.
이는 LLMs와 retrieval에 대한 지식을 전제로 합니다. 이미 해당 섹션들을 탐색하지 않았다면, 추천합니다.
설정: LangSmith
에이전트는 사용자에게 보여지는 출력을 반환하기 전에, 자체 결정적이고 입력 종속적인 일련의 단계를 거칩니다. 이로 인해 이러한 시스템을 디버깅하는 것은 특히 까다로우며, 관찰력이 특히 중요합니다. 이러한 경우에 특히 유용한 도구가 바로 LangSmith입니다.
LangChain으로 빌드할 때, 모든 단계는 자동으로 LangSmith에서 추적됩니다. LangSmith를 설정하기 위해서는 다음의 환경 변수만 설정하면 됩니다:
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="<your-api-key>"
도구 정의
먼저 우리가 사용하려는 도구를 생성해야 합니다. 우리는 두 가지 도구를 사용할 것입니다: Tavily(온라인 검색)와 우리가 만든 인덱스에서 특정 데이터를 검색하기 위한 리트리버.
- Tavily
LangChain에는 Tavily 검색 엔진을 도구로 쉽게 사용할 수 있는 내장 도구가 있습니다. 이는 API 키가 필요합니다 - 무료 계층이 있지만, API 키를 갖고 있지 않거나 만들고 싶지 않은 경우에는 이 단계를 무시할 수도 있습니다.
API 키를 생성한 후에는 다음과 같이 내보내야 합니다:
export TAVILY_API_KEY="..."
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults()
search.invoke("what is the weather in SF")
- 리트리버
우리는 또한 자체 데이터에 대한 리트리버를 생성할 것입니다. 각 단계에 대한 자세한 설명은 해당 섹션을 참조하십시오.
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.get_relevant_documents("how to upload a dataset")[0]
우리가 리트리버를 통해 검색할 인덱스를 생성했으므로, 쉽게 도구로 변환할 수 있습니다 (에이전트가 제대로 사용할 수 있는 형식으로).
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search",
"LangSmith에 대한 정보를 검색합니다. LangSmith에 대한 질문이 있다면, 반드시 이 도구를 사용하세요!",
)
도구
두 도구를 모두 생성했으므로, 하위 스트림에서 사용할 도구 목록을 만들 수 있습니다.
tools = [search, retriever_tool]
LangChain 에이전트 생성 방법
이제 우리가 도구를 정의했으므로, 에이전트를 생성할 수 있습니다. 우리는 OpenAI Functions 에이전트를 사용할 것입니다 - 이러한 종류의 에이전트 및 다른 옵션에 대한 더 자세한 정보는 이 가이드를 참조하십시오.
먼저, 에이전트로 작동할 LLM을 선택합니다.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
다음으로, 에이전트를 가이드하는 데 사용할 프롬프트를 선택합니다.
from langchain import hub
# 사용할 프롬프트 가져오기 - 이 부분을 수정할 수 있습니다!
prompt = hub.pull("hwchase17/openai-functions-agent")
prompt.messages
이제 LLM, 프롬프트 및 도구로 에이전트를 초기화할 수 있습니다. 에이전트는 입력을 수신하고 어떤 동작을 취할지 결정하는 책임을 지닙니다. 중요한 것은, 에이전트는 그 동작을 실행하지 않습니다 - 그것은 에이전트 실행자(AgentExecutor)가 실행합니다 (다음 단계). 이러한 구성 요소를 어떻게 생각해야 하는지에 대한 자세한 정보는 개념 가이드를 참조하십시오.
from langchain.agents import create_openai_functions_agent
agent = create_openai_functions_agent(llm, tools, prompt)
마지막으로, (두뇌인) 에이전트와 도구를 AgentExecutor(에이전트 실행자) 내부에 결합합니다 (에이전트를 반복적으로 호출하고 도구를 실행). 이러한 구성 요소를 어떻게 생각해야 하는지에 대한 자세한 정보는 개념 가이드를 참조하십시오.
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
에이전트 실행
이제 에이전트를 몇 가지 쿼리에 대해 실행할 수 있습니다! 현재는 모두 상태를 가지고 있지 않은 쿼리입니다 (이전 상호 작용을 기억하지 않습니다).
agent_executor.invoke({"input": "안녕하세요!"})
agent_executor.invoke({"input": "langsmith는 테스트에 어떻게 도움이 될까요?"})
agent_executor.invoke({"input": "SF의 날씨는 어떻게 되나요?"})
메모리 추가 Agent Types
랑체인 에이전트의 영역에서는 다양성이 매우 중요합니다. 각 에이전트들은 다른 작업과 기능에 적합하도록 여러 가지 스타일을 가지고 있습니다. Agent Types의 세부 모델 유형, chat history 지원 여부, 멀티 입력 툴, 병렬 함수 호출, 필요한 모델 인자에 대해 알아보도록 하겠습니다. 이러한 카테고리를 이해하면 개인의 요구 사항에 따라 완벽한 에이전트를 선택할 수 있습니다.
-
OpenAI Tools: 최신 OpenAI 모델 (1106 이후)에 최적화된 최첨단 기술입니다. 이는 챗 상호 작용을 처리하고, 다중 입력 툴을 지원하며, 병렬 함수 호출을 실행하고, 'tools' 모델 인자를 필요로 합니다. OpenAI의 최근 기술을 활용하는 데 이상적입니다.
-
OpenAI Functions: OpenAI 또는 OpenAI의 함수 호출 능력을 모방한 오픈 소스 모델에 대한 에이전트입니다. 챗 환경에서 이에 능하며, 다중 입력 툴을 다루고, 'functions' 모델 인자를 필요로 합니다. 함수 호출에 능한 모델에 적합한 선택입니다.
-
XML: XML 등에서 유능한 모델인 Anthropic의 주요 에이전트입니다. 이는 챗 모델이 아닌 LLM(언어 모델)을 위한 것으로, 챗 히스토리를 지원하며, 단일 문자열 입력이 필요한 구조화되지 않은 툴과 잘 어울립니다. XML에 능한 모델과 작업할 때는 이를 선택하세요.
-
Structured Chat: 다중 입력 툴을 지원하는 챗 어플리케이션에 탁월한 특징을 가진 다재다능한 에이전트입니다. 추가 모델 인자가 필요하지 않으므로 복잡한 툴 상호 작용을 필요로 하는 프로젝트에 좋은 선택입니다.
-
JSON Chat: JSON에 능한 모델을 대상으로 한 챗 어플리케이션입니다. JSON 친화적인 모델과의 작업을 간소화하여 챗 기반 어플리케이션 개발을 단순화시킵니다.
-
ReAct: 간단하지만 효과적인 LLM 어플리케이션에 대한 에이전트로, 간단한 구현이 필요한 모델을 위한 훌륭한 시작점입니다.
-
Self Ask With Search: 단일 검색 툴을 갖춘 간단한 모델에 이상적인 에이전트입니다. 간결하고 집중적인 도구 세트가 필요한 프로젝트에 최적의 선택입니다.
각각의 에이전트 유형은 자체적인 강점을 가지고 있으며, 이를 통해 프로젝트의 특정 요구 사항에 맞춰 에이전트를 선택하는 것이 중요합니다. 챗 히스토리, 다중 입력 툴, 병렬 함수 호출 등을 지원해야 할 경우에는 해당 요구 사항에 맞는 에이전트를 선택하세요. 작업의 복잡성, 선택한 언어 모델의 능력, 어플리케이션이 다루어야 하는 상호 작용의 성격과 함께 이러한 요인들을 조율하여 프로젝트에 적합한 에이전트 유형과 함께 랑체인 에이전트의 전체 잠재력을 소프트웨어 개발과 혁신적인 솔루션, 간소화된 워크플로우를 통해 개척해 나갈 수 있습니다.
랑체인 에이전트에 대한 복잡성을 더 집중적으로 다루기 위해 본 안내서는 다양한 에이전트 유형의 실용적인 적용 방법과 심층적인 이해를 제공하는 것을 목표로 합니다. 구체적인 샘플 코드와 시나리오를 탐구함으로써 여러분은 프로젝트의 요구 사항에 가장 적합한 에이전트를 선택하고 구현하는 데에 도움을 받을 수 있을 것입니다. 랑체인 에이전트의 핵심 요소에 대해 자세히 살펴보며, 다양한 예시를 통해 그 독특한 특징과 기능을 강조합니다.
LangChain Agents #1: OpenAI Tools Agent
OpenAI Tools 에이전트는 가장 최근의 OpenAI 모델과 완벽하게 연동되도록 설계되어 있으며, 다양한 함수 또는 "툴"을 동시에 실행하는 것을 용이하게 해줍니다. 이 에이전트는 여러 외부 API와 상호 작용하거나 여러 작업을 병렬로 수행해야 하는 경우에 특히 유용하며, 이로써 전체 처리 시간을 단축시킬 수 있습니다.
샘플 코드:
# 필요한 라이브러리와 툴을 임포트합니다.
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
# Tavily Search툴을 초기화합니다.
tools = [TavilySearchResults(max_results=1)]
# 프롬프트를 가져오고 LLM을 설정합니다.
prompt = hub.pull("hwchase17/openai-tools-agent")
llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)
# OpenAI Tools 에이전트를 생성합니다.
agent = create_openai_tools_agent(llm, tools, prompt)
# 예제 코드 실행
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
response = agent_executor.invoke({"input": "LangChain은 무엇인가요?"})
print(response)
이 예제에서 create_openai_tools_agent
함수는 입력에 기반하여 하나 이상의 도구를 호출할 수 있는 에이전트를 생성합니다. 이 예제에서는 Tavily Search 도구를 사용하여 웹 검색 기능을 보여줍니다.
LangChain Agents #2: OpenAI Functions Agent
OpenAI Functions 에이전트는 입력에 기반하여 모델이 호출할 함수의 여부와 어떤 함수를 호출할지를 결정해야 하는 작업에 가장 적합합니다. 도구 에이전트와 유사하지만, 이는 함수 호출이 작업의 핵심인 경우에 특별히 설계되었으며, OpenAI는 최신 모델에 대해서는 도구를 사용하는 방식을 권장하도록 이 접근 방식을 폐기했습니다.
예제 코드:
# OpenAI Functions 에이전트 설정
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
# 도구 초기화 및 LLM 선택
tools = [TavilySearchResults(max_results=1)]
prompt = hub.pull("hwchase17/openai-functions-agent")
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")
# OpenAI Functions 에이전트 생성 및 실행
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
response = agent_executor.invoke({"input": "LangChain은 무엇인가요?"})
print(response)
이 예제는 OpenAI Functions 에이전트를 설정하고 사용하는 방법을 강조하며, Tavily Search를 도구로 활용하여 사용자 쿼리에 기반한 특정 함수의 호출 기능을 에이전트가 어떻게 구현하는지 보여줍니다.
LangChain Agents #3: XML Agent
XML 에이전트는 XML 구조 생성 및 해석에 능숙한 모델에 최적화되어 있습니다. 이 에이전트 유형은 구조화된 데이터를 다루거나, 모델과의 상호작용이 XML의 구조화된 형식을 통해 이루어지는 경우에 이점을 제공합니다.
예제 코드:
# XML 에이전트 초기화
from langchain import hub
from langchain.agents import AgentExecutor, create_xml_agent
from langchain_community.chat_models import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
tools = [TavilySearchResults(max_results=1)]
prompt = hub.pull("hwchase17/xml-agent-convo")
llm = ChatAnthropic(model="claude-2")
# XML 에이전트 생성 및 실행
agent = create_xml_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
response = agent_executor.invoke({"input": "LangChain은 무엇인가요?"})
print(response)
이 설정은 XML 에이전트를 사용하는 방법을 보여주며, XML에 능숙한 Anthropic 모델인 Claude-2를 활용합니다. XML 형식은 에이전트와 모델 간의 구조화된 통신을 제공하여 복잡한 데이터 처리를 용이하게 합니다.
LangChain Agents #4: JSON Chat Agent
JSON 챗 에이전트는 출력에 JSON 형식을 활용하여 구조화된 응답 데이터를 생성하기 때문에, 구조화된 응답 데이터가 필요한 애플리케이션에 적합합니다. 이 에이전트는 JSON 구조 생성 및 처리에 능숙한 챗 모델에 효과적으로 활용됩니다.
예제 코드:
# JSON Chat 에이전트 설정
from langchain import hub
from langchain.agents import AgentExecutor, create_json_chat_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
tools = [TavilySearchResults(max_results=1)]
prompt = hub.pull("hwchase17/react-chat-json")
llm = ChatOpenAI()
# JSON Chat 에이전트 생성 및 실행
agent = create_json_chat_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
response = agent_executor.invoke({"input": "LangChain은 무엇인가요?"})
print(response)
여기서 JSON Chat 에이전트는 입력을 처리하고 JSON 구조화된 응답을 생성하기 위해 사용되며, 웹 검색 기능인 Tavily Search 도구를 활용합니다. 이 에이전트는 구조화된 응답이 추가 처리나 사용자와의 구조화된 상호작용에 필요한 시나리오에서 특히 유용합니다.
LangChain Agents #5: Structured Chat Agent
Structured Chat 에이전트는 다중 입력 도구와 상호작용하는 시나리오에서 우수한 성능을 발휘하며, 각 도구 호출에 대해 여러 매개변수를 고려해야 하는 복잡한 작업을 지원합니다.
예제 코드:
# Structured Chat 에이전트 초기화
from langchain import hub
from langchain.agents import AgentExecutor, create_structured_chat_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
tools = [TavilySearchResults(max_results=1)]
prompt = hub.pull("hwchase17/structured-chat-agent")
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-1106")
# Structured Chat 에이전트 생성 및 실행
agent = create_structured_chat_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
response = agent_executor.invoke({"input": "LangChain은 무엇인가요?"})
print(response)
이 예제는 Structured Chat 에이전트를 사용하여 다중 입력 도구와 효과적으로 상호작용하는 방법을 보여줍니다. 상세한 프롬프트를 지정하고 적합한 언어 모델을 선택함으로써, 이 에이전트는 복잡한 쿼리와 도구 상호작용을 원활하게 처리할 수 있습니다. 이 markdown 파일의 번역은 다음과 같습니다:
LangChain Agents의 차이점과 기능을 이해함으로써 개발자들은 언어 모델과 자동화된 작업의 전체 잠재력을 활용하여 응용 프로그램을 보다 잘 맞출 수 있습니다. 당신의 응용 프로그램이 간단한 함수 호출, 구조화된 데이터 처리 또는 복잡한 다중도구 상호작용을 필요로 한다면, 요구 사항에 맞는 LangChain Agent가 있습니다. 이러한 예를 기반으로 더 똑똑하고 효율적이며 반응성 있는 응용 프로그램을 구축하는 여정을 시작할 준비가 되어 있습니다.
결론
LangChain Agents는 고급 언어 모델 기능을 응용 프로그램에 통합하려는 개발자들에게 다재다능하고 강력한 도구를 제공합니다. OpenAI Tools 및 Functions Agents부터 XML, JSON Chat, 그리고 Structured Chat Agents까지 각 에이전트 유형의 세부 사항을 이해함으로써 프로젝트의 특정 요구 사항에 맞는 적절한 도구를 선택할 수 있습니다. 이러한 에이전트들은 간단한 함수 호출부터 다중 입력과 구조화된 데이터 형식을 포함한 복잡한 상호작용까지 다양한 작업을 처리할 수 있습니다.