[LLM 개발기초] 8. Agent 와 다양한 도구 활용법
앞선 강좌들에서는 LLM 추론 능력을 향상하기 위해 두 가지 중요한 도구 – 프롬프트와 RAG 를 활용했습니다.
이 도구들이 LLM 활용의 근본임은 의심의 여지가 없지만, 우리는 특정한 시점의 데이터에 머물러있는 LLM 을 최신의 정보와 동적으로 결합하길 원합니다. 검색엔진이나 논문 저장소, 위키피디아 등의 데이터 소스와 연결하고 LLM 이 처리하기 어려운 수학 연산이나 인터넷 서비스와의 연결, 코드의 실행 결과가 필요할 수도 있겠죠.
LangChain 에서는 LLM 자체로는 처리가 어려운 기능들을 도구(Tool)로 제공하고 있습니다. 하지만 도구는 도구일 뿐, 여러가지 도구들을 상황에 맞게 적절히 사용할 수 있도록 LangChain 코드로 구성하는 일 또한 만만치 않은 작업입니다.
우리가 명령한 작업은 원하는 결과가 나올때까지 여러가지 도구들을 동적으로, 반복해서 사용해야 할 수도 있으므로 도구를 사용하기 위한 “현명한 판단”들이 필요합니다. 이걸 미리 코드로 짜두기는 매우 어렵습니다.
Agent 가 이런 문제를 해결해주는 LangChain 의 자동화 된 고급 구성요소입니다. LLM 이 사용할 수 있는 도구들을 넣어주면 문제 해결을 위해 LLM 스스로 작업을 구성하고 관리하는 것입니다.
도구를 사용하는 관점에서 Agent의 역할을 설명했지만, 실제로는 그보다 더 많은 기능들을 포함하고 있습니다.
- 다중 도구 활용
- 검색, 계산, 데이터베이스 쿼리 등 다양한 도구를 통합하여 사용할 수 있습니다.
- 복잡한 작업을 여러 단계로 나누어 처리할 수 있습니다.
- 자율적 의사결정
- Agent는 주어진 작업을 어떻게 수행할지 스스로 결정합니다.
- 필요한 도구를 선택하고 적절한 순서로 사용합니다.
- 필요한 경우에만 외부 도구를 사용하여 리소스를 효율적으로 활용합니다.
- 추론 능력
- 중간 결과를 분석하고 다음 단계를 결정하는 등의 추론 과정을 수행합니다.
- 오류 처리
- 작업 중 발생하는 오류를 인식하고 대안을 찾을 수 있습니다.
- 대화 맥락 유지
- 이전 대화 내용을 고려하여 일관성 있는 응답을 생성합니다.
- 새로운 도구를 쉽게 추가하거나 제거할 수 있어 확장성이 뛰어납니다.
- 다양한 유형의 작업에 적응할 수 있습니다.
- 각 세부 실행 단계에서의 결정 과정을 설명할 수 있어 투명성이 높습니다.
- 특정 작업이나 도메인에 맞춰 Agent를 구성할 수 있습니다.
그리고 위와 같은 Agent 처리 과정을 관리해주는 것이 AgentExecutor 입니다. LangChain 에서 chain 을 생성해서 chain.invoke() 등으로 LLM을 실행했듯이 Agent는 AgentExecutor 를 통해 작업을 관리하고 실행합니다.
LangChain 에서 Agent 를 구현할 때 Agent 의 타입을 설정할 수 있습니다.
- Zero-shot ReAct: 작업과 도구 설명을 보고 사용할 도구를 결정
- Structured input ReAct: 복잡다양한 input 을 처리하는 도구를 활용하는 Agent
- Conversational ReAct: 대화 + ReAct, 대화를 저장
- Self-ask with search: 검색 도구를 활용한 Agent
- ReAct document store: 문서 저장소 + ReAct, 문서 검색 도구 사용
이 중 가장 기본이 되는 것은 Zero-shot ReAct 타입입니다.
“Zero-shot”은 모델이 이전에 본 적 없는 작업이나 상황에 대해 추론하고 대응할 수 있는 능력을 의미합니다. 그리고 ReAct 는 LLM 이 다양한 도구를 사용해서 문제를 해결하는 방법을 의미하며, 이런 LLM 문제 해결법을 제시한 아래 논문에 등장하는 단어입니다.
- ReAct: Synergizing Reasoning and Acting in Language Models
- 에이전트는 주어진 문제를 분석하고, 사용 가능한 도구들 중에서 가장 적합한 것을 선택하여 문제를 해결합니다.
- 이 과정에서 ‘생각'(Thought), ‘행동'(Action), ‘관찰'(Observation) 단계를 반복합니다.
Agent 실습 1: 검색엔진을 활용하는 챗봇 만들기
가장 간단한 Agent 구현체부터 만들어 보겠습니다. LLM 모델은 학습을 하는 특정 시점의 데이터에 의존적입니다. 가장 최신의 뉴스나 정보는 알지 못하고, 우리가 미리 예측해서 정보를 넣어두기도 힘듭니다. 이런 경우 뉴스, 논문, 위키피디아, 웹 검색 등의 도구를 이용해서 필요한 데이터들을 마련할 수 있겠지요.
이번 챕터에서는 웹 검색 도구를 이용하는 간단한 예제를 살펴보겠습니다. [08_01_agent_with_single_tool.py]
웹 검색 엔진 중 DuckDuckGo 를 이용하도록 Tool 을 생성해서 Agent 에게 전달합니다. 그럼 Agent 는 사용자의 질문에 대한 대답을 할 수 있도록 수차례 검색을 수행해서 데이터를 수집하고, 데이터를 정리해서 사용자에게 보여주는 순서로 동작합니다. 데이터 수집을 위해 검색을 반복하는 판단은 Agent 가 합니다.
import os from dotenv import load_dotenv from langchain_core.prompts import ChatPromptTemplate from langchain_community.tools.ddg_search.tool import DuckDuckGoSearchRun from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent # 프로세스 실행을 위한 환경설정 및 파라미터 준비 # LangSmith 사이트에서 아래 내용을 복사해서 .env 파일에 입력 # LANGCHAIN_TRACING_V2=true # LANGCHAIN_ENDPOINT=https://api.smith.langchain.com # LANGCHAIN_API_KEY=<your_api_key> # LANGCHAIN_PROJECT="<your_project_name>" load_dotenv() # 1. 프롬프트 템플릿 준비 # {tools} : 사용가능한 도구를 Agent 에게 알려주기 위해 필요한 파라미터 (필수) # {tool_names} : 다음 작업(Action)에 필요한 도구들을 표시하는 파라미터 (필수) # {agent_scratchpad} : Agent 가 수행해야 하는 작업의 내용을 표시 (필수) prompt = ChatPromptTemplate.from_template( """당신은 유능한 기상학자입니다. 필요한 경우 다음 도구들을 사용할 수 있습니다: {tools} Use the following format: Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question ============================= Chat history ============================= {chat_history} ================================ Human Message ================================= Question: {question} ============================= Messages Placeholder ============================= Thought: {agent_scratchpad} """ ) # 2. LLM 초기화 openai_api_key = os.getenv("OPENAI_API_KEY") llm = ChatOpenAI( temperature=0, max_tokens=2048, model_name="gpt-4o-mini", openai_api_key=openai_api_key, ) # 3. DuckDuckGo 검색 도구 초기화 search = DuckDuckGoSearchRun() tools = [search] # 4. agent 생성 agent = create_react_agent(llm, tools, prompt) # 4-1. agent_executor 생성 agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 이전 챗을 기억하기 위해 chat_history 사용 chat_history = [] # 5. 챗 실행 while True: # 5-1. 사용자 질문을 입력 받음 user_input = input("\n\n당신 (종료 q): ") if user_input in ("끝", "종료", "q", "exit"): break # 5-2. Agent 실행 result = agent_executor.invoke( {"question": user_input, "chat_history": chat_history} ) # 5-3. 응답이 dictionary 로 전달되므로 output 만 추출해서 출력 output_text = result["output"] print(f"\nAI --->\n{output_text}") # 대화내역 저장 chat_history.append(f"user: {user_input}") chat_history.append(f"assistant: {output_text}")
- 프롬프트를 준비합니다.
- 프롬프트에는 일반적인 내용외에 Agent 용 3개의 필수 항목이 포함되어야 합니다.
- {tools} : 사용가능한 도구를 Agent 에게 알려주기 위해 필요한 파라미터
- {tool_names} : 다음 작업(Action)에 필요한 도구들을 표시하는 파라미터
- {agent_scratchpad} : Agent 가 수행할 작업의 세부 내용을 담은 파라미터
- 이 파라미터는 Agent 가 동작할 때 자동으로 프롬프트에 설정됩니다. (없으면 에러 발생)
- 프롬프트에는 일반적인 내용외에 Agent 용 3개의 필수 항목이 포함되어야 합니다.
- LLM 초기화
- DuckDuckGo 검색 도구 초기화
- Agent 생성
- Agent 생성을 위해 제공되는 함수가 몇 가지 있습니다
- create_react_agent, create_json_agent, create_structured_chat_agent…
- 여기서는 create_react_agent() 를 사용
- 링크에서 함수를 검색해서 사용예제를 살펴보세요
- 기존 agent 를 실행하던 방식에서 agent_executor 를 사용하는 방식으로 바뀌었습니다.
- Agent 생성을 위해 제공되는 함수가 몇 가지 있습니다
- 챗 실행
- Agent 를 실행하면 Agent 의 처리 상황을 단계별로 출력합니다.
- 처리가 완료되면 처리결과가 result 에 담겨져서 나옵니다.
프롬프트에 Agent 가 사용할 tool 데이터와 실행 단계별로 Agent 가 수행해야 할 작업{agent_scratchpad}이 명시됩니다. LLM 은 답변하기 충분한 데이터를 확보할 때까지 검색 도구를 실행합니다.
LangChain의 create_react_agent() 함수는 ReAct 방식을 구현한 에이전트를 생성합니다. ReAct 에이전트는 주어진 작업을 수행하기 위해 추론 단계와 행동 단계를 번갈아 가며 수행하고, 필요에 따라 도구를 사용하거나 추가 정보를 요청합니다.
코드를 실행하면 아래와 같이 출력됩니다.
LLM에 입력되지 않은 2024년 태풍 정보를 얻기위해 DuckDuckGo search tool 을 수차례 수행하면서 대답에 필요한 데이터를 확보합니다. 데이터가 확보되면 정리해서 답변을 했습니다.
> python -u "c:\Workspace\___Shared\Llama\test\llama_test\LLM_test\08_01_agent_with_single_tool.py" 당신 (종료 q): 2024년 태풍 발생 상황에 대해 알려줘 > Entering new AgentExecutor chain... Thought: 2024년 태풍 발생 상황에 대한 정보를 얻기 위해 검색해야 한다. Action: duckduckgo_search Action Input: "2024 typhoon occurrence situation"Boats return to port to shelter from Typhoon Gaemi on July 23, 2024 in Taizhou, China. VCG/Getty Images For many in China, the prospect of another major storm bringing more water is a big concern. A road is seen flooded caused by Typhoon Gaemi and monsoon rains on July 24, 2024 in Quezon City. Ezra Acayan/Getty Images Rescuers evacuate residents from their flooded homes on July 24, 2024 in ... July 26, 2024, at 4:55 a.m. Typhoon Gaemi Weakens to a Tropical Storm as It Moves Inland Carrying Rain Toward Central China. More. Uncredited. In this photo released by the Taiwan Ministry of ... Updated July 25, 2024 at 2:13 p.m. E.T. Gaemi was a typhoon in the Taiwan Strait Thursday morning Taiwan time, the Joint Typhoon Warning Center said in its latest advisory. July 26, 2024. Typhoon Gaemi churned over southeastern China on Friday, with the local authorities warning that the storm, which left a trail of destruction in Taiwan and the Philippines, would ...Thought: 2024년 태풍 발생 상황에 대한 정보를 더 구체적으로 파 악하기 위해 추가 검색이 필요하다. Action: duckduckgo_search Action Input: "2024 typhoon season summary"The 2024 Pacific typhoon season is an ongoing event in the annual cycle of tropical cyclone formation in the western Pacific Ocean. It is the fifth-latest starting Pacific typhoon season on record. The season runs throughout 2024, though most tropical cyclones typically develop between May and October. The season's first named storm, Ewiniar, developed on May 25, and eventually intensified ... NOAA National Weather Service forecasters at the Climate Prediction Center predict above-normal hurricane activity in the Atlantic basin this year. NOAA's outlook for the 2024 Atlantic hurricane season, which spans from June 1 to November 30, predicts an 85% chance of an above-normal season, a 10% chance of a near-normal season and a 5% chance of a below-normal season. 2024 North Atlantic Hurricane Season Outlook Summary. a. Predicted Activity. NOAA's updated outlook for the 2024 Atlantic Hurricane Season indicates that an above-normal season is most likely, with substantially lower odds for a near- or below-normal season. The outlook calls for a 90% chance of above-normal activity, along with a 10% chance ... 2024 North Atlantic Hurricane Season Outlook Summary. a. Predicted Activity. NOAA's updated outlook for the 2024 Atlantic Hurricane Season indicates that an above-normal season is most likely, with low possibilities the season could be near-normal and even lower odds for a below-normal season. The outlook calls for an 85% chance of an above ... A summary infographic showing hurricane season probability and numbers of named storms predicted from NOAA's update to the 2024 Atlantic Hurricane Season Outlook. ... Atmospheric and oceanic conditions continue to support an above-normal 2024 Atlantic hurricane season, with a 90% probability of this result. 2024 has only a 10% chance of a near ...Thought: 2024년 태풍 발생 상황에 대한 정보를 종합적으로 정리할 필요가 있다. Final Answer: 2024년 태풍 시즌은 현재 진행 중이며, 태풍 발생은 주로 5월부터 10월 사이에 집중됩니다. 첫 번째 이름이 붙은 태풍은 5월 25일에 발생한 '에우이니아(Ewiniar)'입니다. 2024 년 태풍 시즌은 기록상 다섯 번째로 늦게 시작된 시즌으로, 태풍 '가에미(Gaemi)'는 7월 23일 중국 타이저우에서 발생하여 필리핀과 대만에 큰 피해를 주었습니다. NOAA의 예측에 따르면, 2024년 대서양 허리케인 시즌은 정상 이상으로 활동할 가능성이 높으며, 태풍 발생이 증가할 것으로 보입니다. > Finished chain. AI ---> 2024년 태풍 시즌은 현재 진행 중이며, 태풍 발생은 주로 5월부터 10월 사이에 집중됩니다. 첫 번째 이름이 붙은 태풍은 5월 25일에 발생한 '에우이니아(Ewiniar)'입니다. 2024년 태풍 시즌은 기록상 다섯 번째로 늦게 시작된 시즌으로, 태풍 '가에미(Gaemi)'는 7월 23일 중국 타이저우에서 발생하여 필리핀과 대만에 큰 피해를 주었습니다. NOAA의 예측에 따르면, 2024년 대서양 허리 케인 시즌은 정상 이상으로 활동할 가능성이 높으며, 태풍 발생이 증가할 것으로 보입니다. 당신 (종료 q): 가에미가 아니라 개미야. 수정된 내용을 다시 답변해줘 > Entering new AgentExecutor chain... Thought: I need to clarify the information regarding the typhoon named "개미" instead of "가에미." I will search for the latest updates on the typhoon situation in 2024 to provide accurate information. Action: duckduckgo_search Action Input: "2024년 태풍 개미 발생 상황" 북서태평양 위성 영상에 관측된 태풍 '개미'의 모습(2024년 7월 20일) 2024년 제 3호 태풍 개미(GAEMI)가 오늘 오후 3시경 발생했다. 북서태평양 위성 영상을 보면 필리핀 동해상에서 발달 중인 '개미'와 남중국해에서 태풍 승격을 앞둔 예비 4호 태풍 프라피룬(PRAPIROON)의 ... 건물 간판이 힘없이 떨어지고, 생방송을 하던 기자 역시 바람을 이겨내지 못합니다. "태풍 개미는 점점 더 강해지고 있습니다. 그러니까 여러분, 절대로 외출하지 마십시오!" 어제 (25) 새벽 타이완에 상륙한 개미는 최대 풍속 시속 220km에 달하는 강풍으로 곳곳에 ... 3호 태풍 '개미'는 목요일쯤 대만 북부를 지나겠고, 중국 푸저우 인근에 상륙한 뒤 내륙으로 올라갈 전망입니다. 기상청은 태풍 '개미'가 중국 내륙으로 올라가 소멸하는 주 후반쯤이면 장마 종료에 대한 판단이 가능할 걸로 내다봤습니다. 연합뉴스tv 김동혁입니다. 2024년 올해 여름 장마가 끝자락에 와있다.기상청 날씨 예보에 따르면 한반도에 폭염을 몰고 오 는 북태평양고기압의 영향권에 든 남부 지방과 제주도는 이번 주말쯤 장마가 끝날 것으로 보인다. 중부지방은 현재 중국 푸저우 부근에서 북상 중인 제3호 태풍 ... 대만 할퀸 태풍 개미 북상 에…中, 경보 격상·15만명 대피(종합) ... 이어 이번 개미가 2016년 7월 제1호 태풍 네파탁 이후 약 8년 만에 대만에 상륙한 '강급' 태풍이라고 전했다. ... ai 학습 및 활용 금지> 2024/07/25 18:15 ...Thought: I have gathered the correct information regarding Typhoon "개미" (Gaemi) and its impact. I will summarize the details for clarity. Final Answer: 2024년 제3호 태풍 개미(GAEMI)는 7월 20일에 발생하였으며, 7월 25일 대만에 상륙했습니다. 최대 풍속은 시속 220km에 달하며, 대만 북부를 지나 중국 푸저우 인근에 상륙할 것 으로 예상됩니다. 태풍 개미는 강한 바람으로 인해 피해가 발생하고 있으며, 기상청은 태풍이 소멸하는 주 후반에 장마 종료에 대한 판단을 내릴 것으로 보입니다. > Finished chain. AI ---> 2024년 제3호 태풍 개미(GAEMI)는 7월 20일에 발생하였으며, 7월 25일 대만에 상륙했습니다. 최대 풍속은 시속 220km에 달하며, 대만 북부를 지나 중국 푸저우 인근에 상륙할 것으로 예상됩니 다. 태풍 개미는 강한 바람으로 인해 피해가 발생하고 있으며, 기상청은 태풍이 소멸하는 주 후반에 장마 종료에 대한 판단을 내릴 것으로 보입니다. 당신 (종료 q):
두 번째 질문에서 검색 도구를 사용한 횟수는 앞선 질문과는 다르다는 것을 알 수 있습니다.
LangSmith 에서 Runs – Trace 항목을 열어보면 Agent 실행 정보를 자세히 볼 수 있습니다.
- LangSmith – Project – 지정한 프로젝트 폴더 – Runs – AgentExecutor 항목 확인
두 번째 질문에 대해서는 내용 보강을 위해 search tool 을 더 많이 사용하고 있습니다.
Agent 실습 2: 두 개의 도구를 함께 사용하는 Agent 구현
이번에는 두 개의 Tool – 검색 도구와 연산(math) 도구를 함께 사용하는 예제를 작성해 보겠습니다.
우리나라 특정 행정구역의 2023년 인구수와 다른 행정구역 대비 몇 퍼센트에 해당하는지 계산하도록 질문하겠습니다. 이런 질문에 대해 Agent 가 두 가지 도구를 적절히 사용해서 정확한 답을 계산하는지 확인해 보겠습니다.
실습 1과 코드는 거의 유사하며 Math 도구만 추가되었습니다. [08_02_agent_with_multiple_tools.py]
import os from dotenv import load_dotenv from langchain_core.prompts import ChatPromptTemplate from langchain_community.tools.ddg_search.tool import DuckDuckGoSearchRun from langchain_openai import ChatOpenAI from langchain.agents.react.agent import create_react_agent from langchain.chains.llm_math.base import LLMMathChain from langchain.agents import Tool from langchain.agents.agent import AgentExecutor load_dotenv() # 1. 프롬프트 템플릿 준비 prompt = ChatPromptTemplate.from_template( """ Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! ============================= Chat history ============================= {chat_history} ================================ Human Message ================================= Question: {question} ============================= Messages Placeholder ============================= Thought:{agent_scratchpad} """ ) # 2. LLM 초기화 openai_api_key = os.getenv("OPENAI_API_KEY") llm = ChatOpenAI( temperature=0, model_name="gpt-4o-mini", openai_api_key=openai_api_key, ) # 3. Agent 도구 초기화 # 3-1. DuckDuckGo 검색 도구 초기화 search_tool = Tool( name="Search", func=DuckDuckGoSearchRun().run, description="DuckDuckGo 웹 검색 도구" ) # 3-2. Math 계산 도구 초기화 math_tool = Tool.from_function( name="Calculator", func=LLMMathChain.from_llm(llm=llm).run, description="""Useful for when you need to answer questions about math. This tool is only for math questions and nothing else. Only input math expressions.""", ) # 3-3. 도구 리스트 생성 tools = [search_tool, math_tool] # 4. agent 생성 agent = create_react_agent(llm, tools, prompt) # 4-1. agent_executor 생성 agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 이전 챗을 기억하기 위해 chat_history 사용 chat_history = [] # 5. 챗 실행 while True: # 5-1. 사용자 질문을 입력 받음 user_input = input("\n\n당신 (종료 q): ") if user_input in ("끝", "q", "exit"): break # 5-2. Agent 실행 result = agent_executor.invoke( {"question": user_input, "chat_history": chat_history} ) # 5-3. 응답이 dictionary 로 전달되므로 output 만 추출해서 출력 output_text = result["output"] print(f"\nAI --->\n{output_text}") # 5-4. 대화내역 저장 chat_history.append(f"user: {user_input}") chat_history.append(f"assistant: {output_text}")
- 프롬프트를 준비합니다.
- LLM 초기화
- 도구 초기화
- DuckDuckGo 검색 도구 초기화
- Math 계산 도구 초기화
- 자연어 -> 수식 변환을 위해 초기화에 LLM 이 필요
- Agent / Agent executor 생성
- 챗 실행
코드를 실행하고 아래와 같이 최신 데이터 검색 + 검색한 수치 결과를 가지고 특정한 값을 계산하도록 유도했습니다.
> python -u "c:\Workspace\......\test_multiple_tools.py" 당신 (종료 q): 서울의 인구는 얼마인가? 그리고 경기도 인구 대비 몇 퍼센트에 해당하는가? > Entering new AgentExecutor chain... To answer the question about the population of Seoul and its percentage compared to the population of Gyeonggi-do, I will first search for the current population of Seoul and Gyeonggi-do. Action: Search Action Input: "서울 인구 2023" 서울시 영유아 가구수 현황 1. 서울시 인구 현황 및 인구 구조 2023년 현재 서울시 인구는 총 933만 8,274명이다. 서울시 전체 인구를 나이별로 줄세웠을 때 중간에 있는 시민의 중위연령은 44.3세 이다. 가운데가 넓은 항아리형 구조인데 20대, 50대, 60대 인구의 비중이 ... 2023년 4/4분기 서울특별시 주민등록인구통계 (2023. 12. 31. 기준) 2024. 1. 작성목적 지역별 세대 및 인구, 연령구조 및 외국인 인구 현황과 변화 등을 파악하여 정책수립을 위한 기초 자료로 활용 법적근거 통계법 제18조에 의한 일반통계(승인번호:제201003호, 1992.11.13) 2023년 국내인구이동통계 결과 담당자 이현진 담당부서 인구동향과 전화번호 042-481-2285 게시일 2024-01-30 조회 10412 2023 한국의 사회지표.pdf (10.9MB) 다운로드 미리보기. [2023 한국의 사회지표 주요결과] 1. 인구, 가구·가족 (인구 변화) '23년 총인구는 5,171만 명, '72년 총인구는 3,622만 명으로 전망되며, 65세 이상 인구의 비중은 '23년 18.2%에서 '72년 47.7%가 될 것으로 전망 ㅇ (가구 ... 첨부파일. 2023년 12월 국내인구이동 결과 2023년 12월 이동자 수는 51만 1천 명, 전년동월대비 2.8% (1만 4천 명) 증가함. 인구이동률 (인구 백 명당 이동자 수)은 11.8%, 전년동월대비 0.3%p 증가함. 시도별 순이동 (전입-전출)은 인천 (4,233명), 경기 (3,512명), 충남 (1,426명) 등 ... Action: Search Action Input: "경기도 인구 2023" 즉, 경기도 공식 인증 인구 랭킹인 셈. 현행 훈령은 제 1574호로 2023.4.11.부터 시행되고 있다. 매 훈령 개정때마다 화성군-화성시의 성장세가 놀랍다. 과거에는 붙여쓰기를 적용하여 '경기도시군 순서규정'으로 불렀다. 우리나라에서 인구가 가장 많은 경기도의 시군별 인구 현황에 대해 알아보겠습니다. 2023년 10월 기준 경기도의 총인구수는 13,627,840명 입니다.(본 자료는 행정안전부 주민등록통계를 기반으로 작성하였습니다.) 경기도에는 총 31개의 시군이 있습니다. 경기도 내의 시군별 인구수와 전체 경기도 인구중 ... 경기도 인구는 10년 전인 2013년 1254만9345명보다 150만7105 명 늘었다. 증가율은 12.0%다. 이에 따라 전국 인구 중 경기도 인구가 차지하는 비중은 10년 전 24.1%에서 26.7%로 2.6%포인트 올라갔다. 경기도 인구가 1400만명을 돌파했던 지난해 4월 말 26.6% 이후 8개월 사이 ... 경기도 인구 현황 및 인구 구조 . 2023년 현재 경기도 인구는 총 1,379만 4,753명이다. 서울시 인구가 총 933만 8,274명이니 서울시보다 445만 6,479명이 더 많다. 경기도 전체 인구를 나이별로 줄세웠을 때 중간에 있는 경기도민의 중위연령은 43.7세다. 경기도 전체 인구수와 전체 면적 통계, 경기도 시군 인구수 기준 순위와 면적 정보입니다. 인구는 2023년 10월 주민등록 인구수 기준이며 시군 인구수와 세대수, 내국인 남녀 인구수, 외국인 수, 도 전체 대비 비율, 시군 면적, 법정도 수 정보입니다. 경기도 31개 시군 인구수 순위와 면적 정보 경기도 시 ... Action: Calculator Action Input: (9338274 / 13794753) * 100 Answer: 67.6943907585732I now know the final answer. Final Answer: 서울의 인구는 9,338,274명이며, 이는 경기도 인구(13,794,753명)의 약 67.69%에 해당합니다. > Finished chain. AI ---> 서울의 인구는 9,338,274명이며, 이는 경기도 인구(13,794,753명)의 약 67.69%에 해당합니다. 당신 (종료 q):
LangSmith 에서 Trace 과정을 살펴보면
서울과 경기도의 2023년 인구를 구하기 위해 2번의 검색을 수행했습니다. 그리고 경기도 인구 대비 서울 인구의 비율을 구하기 위해 LLMMathChain 을 수행했습니다.
- (9338274 / 13794753) * 100 = 67.6943907585732
결과를 얻기까지 LLM 이 몇 단계의 작업으로 나누어 적절히 도구를 사용했음을 알 수 있습니다. 우리는 Agent 덕분에 이 과정을 몇 줄의 코드만으로 구현할 수 있습니다.
Agent 와 사용할 수 있는 도구들은 다양하게 있지만 아직 문서화가 잘 되어 있지는 않습니다. 아래 클래스와 함수 목록을 참고하세요.
_module_lookup = { "APIChain": "langchain.chains.api.base", "OpenAPIEndpointChain": "langchain_community.chains.openapi.chain", "AnalyzeDocumentChain": "langchain.chains.combine_documents.base", "MapReduceDocumentsChain": "langchain.chains.combine_documents.map_reduce", "MapRerankDocumentsChain": "langchain.chains.combine_documents.map_rerank", "ReduceDocumentsChain": "langchain.chains.combine_documents.reduce", "RefineDocumentsChain": "langchain.chains.combine_documents.refine", "StuffDocumentsChain": "langchain.chains.combine_documents.stuff", "ConstitutionalChain": "langchain.chains.constitutional_ai.base", "ConversationChain": "langchain.chains.conversation.base", "ChatVectorDBChain": "langchain.chains.conversational_retrieval.base", "ConversationalRetrievalChain": "langchain.chains.conversational_retrieval.base", "generate_example": "langchain.chains.example_generator", "FlareChain": "langchain.chains.flare.base", "ArangoGraphQAChain": "langchain_community.chains.graph_qa.arangodb", "GraphQAChain": "langchain_community.chains.graph_qa.base", "GraphCypherQAChain": "langchain_community.chains.graph_qa.cypher", "FalkorDBQAChain": "langchain_community.chains.graph_qa.falkordb", "HugeGraphQAChain": "langchain_community.chains.graph_qa.hugegraph", "KuzuQAChain": "langchain_community.chains.graph_qa.kuzu", "NebulaGraphQAChain": "langchain_community.chains.graph_qa.nebulagraph", "NeptuneOpenCypherQAChain": "langchain_community.chains.graph_qa.neptune_cypher", "NeptuneSparqlQAChain": "langchain_community.chains.graph_qa.neptune_sparql", "OntotextGraphDBQAChain": "langchain_community.chains.graph_qa.ontotext_graphdb", "GraphSparqlQAChain": "langchain_community.chains.graph_qa.sparql", "create_history_aware_retriever": "langchain.chains.history_aware_retriever", "HypotheticalDocumentEmbedder": "langchain.chains.hyde.base", "LLMChain": "langchain.chains.llm", "LLMCheckerChain": "langchain.chains.llm_checker.base", "LLMMathChain": "langchain.chains.llm_math.base", "LLMRequestsChain": "langchain_community.chains.llm_requests", "LLMSummarizationCheckerChain": "langchain.chains.llm_summarization_checker.base", "load_chain": "langchain.chains.loading", "MapReduceChain": "langchain.chains.mapreduce", "OpenAIModerationChain": "langchain.chains.moderation", "NatBotChain": "langchain.chains.natbot.base", "create_citation_fuzzy_match_chain": "langchain.chains.openai_functions", "create_extraction_chain": "langchain.chains.openai_functions", "create_extraction_chain_pydantic": "langchain.chains.openai_functions", "create_qa_with_sources_chain": "langchain.chains.openai_functions", "create_qa_with_structure_chain": "langchain.chains.openai_functions", "create_tagging_chain": "langchain.chains.openai_functions", "create_tagging_chain_pydantic": "langchain.chains.openai_functions", "QAGenerationChain": "langchain.chains.qa_generation.base", "QAWithSourcesChain": "langchain.chains.qa_with_sources.base", "RetrievalQAWithSourcesChain": "langchain.chains.qa_with_sources.retrieval", "VectorDBQAWithSourcesChain": "langchain.chains.qa_with_sources.vector_db", "create_retrieval_chain": "langchain.chains.retrieval", "RetrievalQA": "langchain.chains.retrieval_qa.base", "VectorDBQA": "langchain.chains.retrieval_qa.base", "LLMRouterChain": "langchain.chains.router", "MultiPromptChain": "langchain.chains.router", "MultiRetrievalQAChain": "langchain.chains.router", "MultiRouteChain": "langchain.chains.router", "RouterChain": "langchain.chains.router", "SequentialChain": "langchain.chains.sequential", "SimpleSequentialChain": "langchain.chains.sequential", "create_sql_query_chain": "langchain.chains.sql_database.query", "create_structured_output_runnable": "langchain.chains.structured_output", "load_summarize_chain": "langchain.chains.summarize", "TransformChain": "langchain.chains.transform", } from langchain_community.utilities import ( AlphaVantageAPIWrapper, ApifyWrapper, ArceeWrapper, ArxivAPIWrapper, BibtexparserWrapper, BingSearchAPIWrapper, BraveSearchWrapper, DuckDuckGoSearchAPIWrapper, GoldenQueryAPIWrapper, GoogleFinanceAPIWrapper, GoogleJobsAPIWrapper, GoogleLensAPIWrapper, GooglePlacesAPIWrapper, GoogleScholarAPIWrapper, GoogleSearchAPIWrapper, GoogleSerperAPIWrapper, GoogleTrendsAPIWrapper, GraphQLAPIWrapper, JiraAPIWrapper, LambdaWrapper, MaxComputeAPIWrapper, MerriamWebsterAPIWrapper, MetaphorSearchAPIWrapper, NasaAPIWrapper, OpenWeatherMapAPIWrapper, OutlineAPIWrapper, Portkey, PowerBIDataset, PubMedAPIWrapper, Requests, RequestsWrapper, SceneXplainAPIWrapper, SearchApiAPIWrapper, SearxSearchWrapper, SerpAPIWrapper, SparkSQL, SQLDatabase, StackExchangeAPIWrapper, SteamWebAPIWrapper, TensorflowDatasets, TextRequestsWrapper, TwilioAPIWrapper, WikipediaAPIWrapper, WolframAlphaAPIWrapper, ZapierNLAWrapper, )
각 클래스나 함수의 더 상세한 사용법을 알고 싶으면 아래 링크에서 해당 키워드로 검색하세요. Documentation 과 함께 간단한 사용 예제도 제공합니다.
아직 LangChain 과 Agent 코드는 활발히 개발중입니다. 안정화 버전이 나오기 전까지 코드와 사용법은 수시로 바뀔 수 있다는 점 참고하세요.