도구 (Tools)

LangChain 도구 및 커스텀 도구 생성

LangChain에서 제공하는 도구가 동작하는 방식을 알기 위해 빌트인 도구와 사용자 정의 도구를 생성하는 방법을 다룬다.

AI
RAG
LangChain
저자

Kwangmin Kim

공개

2025년 07월 15일

1 Tool 이란?

AI agent의 tool은 현대 AI 시스템 아키텍처에서 핵심 개념

1.1 AI 아키텍쳐

┌─────────────────────────────────────┐
│     User Input (질문/지시)           │
└────────────┬────────────────────────┘
             │
┌────────────▼────────────────────────┐
│   LLM (Claude) - 쿼리 분석           │
│   - 의도 파악                        │
│   - 필요 tool 판단                   │
└────────────┬────────────────────────┘
             │
    ┌────────┴────────┐
    │                 │
┌───▼──────┐  ┌───────▼─────┐
│Tool 실행  │  │ Tool 실행   │
│(Search)  │  │(Calc/Code)  │
└───┬──────┘  └────┬────────┘
    │              │
    └──────┬───────┘
           │
┌──────────▼──────────────┐
│  결과 통합 및 해석        │
│  - 정보 종합             │
│  - 논리 구성             │
└──────────┬──────────────┘
           │
┌──────────▼──────────────┐
│  최종 응답 생성           │
│  - 텍스트 포맷            │
│  - 인용 추가              │
│  - 구조화 (필요시)        │
└──────────┬──────────────┘
           │
┌──────────▼──────────────┐
│   User에게 응답 반환      │
└─────────────────────────┘
  • 도구(Tool)는 에이전트, 체인 또는 LLM이 답변을 위해 외부 시스템, 데이터베이스, API, 계산 엔진 등에 접근하여 작업을 수행하기 위한 인터페이스 또는 함수
  • LangChain 에서 기본 제공하는 도구를 사용하여 쉽게 도구를 활용할 수 있으며, 사용자 정의 도구(Custom Tool) 를 쉽게 구축하는 것도 가능

LangChain 에 통합된 도구에 대한 설명은 아래 링크에서 확인할 수 있다.

# API 키를 환경변수로 관리하기 위한 설정 파일
from dotenv import load_dotenv

# API 키 정보 로드
load_dotenv()
# LangSmith 추적을 설정합니다. https://smith.langchain.com
# !pip install -qU langchain-teddynote
from langchain_teddynote import logging

# 프로젝트 이름을 입력합니다.
logging.langsmith("CH15-Tools")
import warnings

# 경고 메시지 무시
warnings.filterwarnings("ignore")

2 빌트인 도구(built-in tools)

  • 랭체인에서 제공하는 사전에 정의된 도구(tool) 와 툴킷(toolkit) 을 사용할 수 있다.
  • tool 은 단일 도구를 의미하며, toolkit 은 여러 도구를 묶어서 하나의 도구로 사용할 수 있다.
  • 관련 도구는 아래의 링크: LangChain Tools/Toolkits

2.1 Python REPL 도구

  • 이 도구는 Python 코드를 REPL(Read-Eval-Print Loop) 환경에서 실행하기 위한 클래스를 제공

  • LLM이 문자열로 작성한 코드를 실행하고 결과를 반환

  • 오류가 나면 LLM이 다시 코드를 작성해서 개선된 결과를 반환하도록 돕는데도 이용됨

  • PythonREPLTool

설명

  • Python 셸 환경을 제공
  • 유효한 Python 명령어를 입력으로 받아 실행
  • 결과를 보려면 print(…) 함수를 사용

주요 특징

  • sanitize_input: 입력을 정제하는 옵션 (기본값: True)
  • python_repl: PythonREPL 인스턴스 (기본값: 전역 범위에서 실행)

사용 방법

  • PythonREPLTool 인스턴스 생성
  • run 또는 arun, invoke 메서드를 사용하여 Python 코드 실행

입력 정제

  • 입력 문자열에서 불필요한 공백, 백틱, ‘python’ 키워드 등을 제거
from langchain_experimental.tools import PythonREPLTool

# 파이썬 코드를 실행하는 도구를 생성합니다.
python_tool = PythonREPLTool()
# 파이썬 코드를 실행하고 결과를 반환합니다.
print(python_tool.invoke("print(100 + 200)"))
  • "print(100 + 200)" 이 아닌 300을 출력

아래는 LLM 에게 파이썬 코드를 작성하도록 요청하고 결과를 반환하는 예제

흐름 정리 1. LLM 모델에게 특정 작업을 수행하는 Python 코드를 작성하도록 요청 2. 작성된 코드를 실행하여 결과를 얻는다. 3. 결과를 출력

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
from langchain_experimental.tools import PythonREPLTool

# 파이썬 코드를 실행하는 도구를 생성합니다.
python_tool = PythonREPLTool()

# 파이썬 코드를 실행하고 중간 과정을 출력하고 도구 실행 결과를 반환하는 함수
def print_and_execute(code, debug=False):
    if debug:
        print("CODE:")
        print(code)
    return python_tool.invoke(code)


# 파이썬 코드를 작성하도록 요청하는 프롬프트
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are Raymond Hetting, an expert python programmer, well versed in meta-programming and elegant, concise and short but well documented code. You follow the PEP8 style guide. "
            "Return only the code, no intro, no explanation, no chatty, no markdown, no code block, no nothing. Just the code.",
        ),
        ("human", "{input}"),
    ]
)
# LLM 모델 생성
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 프롬프트와 LLM 모델을 사용하여 체인 생성
chain = prompt | llm | StrOutputParser() | RunnableLambda(print_and_execute)
  • StrOutputParser()은 llm output을 문자열로 변환
  • prompt | llm | StrOutputParser(): python code를 반환
  • print_and_execute(code, debug=False):code에 python code가 입력됨
chain = prompt | llm | StrOutputParser()
# 결과 출력
print(chain.invoke("로또 번호 생성기를 출력하는 코드를 작성하세요."))
import random

def generate_lotto_numbers():
    return sorted(random.sample(range(1, 46), 6))
chain = prompt | llm | StrOutputParser() | RunnableLambda(print_and_execute)
# 결과 출력
print(chain.invoke("로또 번호 생성기를 출력하는 코드를 작성하세요."))
CODE:
import random

def generate_lotto_numbers():
    return sorted(random.sample(range(1, 46), 6))

print(generate_lotto_numbers())
[14, 17, 18, 22, 23, 37]

2.2 검색 API 도구

  • 최신 뉴스 및 정보는 GPT가 학습이 안되어 있어 인터넷 검색이 이루어져야함
  • Tavily 검색 API를 활용하여 인터넷 검색 기능을 구현하는 도구
  • 이 도구는 두 가지 주요 클래스를 제공: TavilySearchResultsTavilyAnswer.
  • SERP API 도구가 구글링과 같은 기능이 있어 가장 유명하지만 Tavily도 나쁘지 않고 특정 경우에는 다른 도구보다 더 좋은 결과를 출력함
    • API 키 발급 주소: - https://app.tavily.com/
    • 한달에 검색 1000번은 무료
  • 발급한 API 키를 .env 파일에 설정 아래와 같이 설정
TAVILY_API_KEY=tvly-abcdefghijklmnopqrstuvwxyz

2.3 TavilySearchResults

  • Tavily 검색 API를 쿼리하고 JSON 형식의 결과를 반환
  • 포괄적이고 정확하며 신뢰할 수 있는 결과에 최적화된 검색 엔진
  • 현재 이벤트에 대한 질문에 답변할 때 유용

주요 매개변수 - max_results (int): 반환할 최대 검색 결과 수 (기본값: 5) - search_depth (str): 검색 깊이 (“basic” 또는 “advanced”) - include_domains (List[str]): 검색 결과에 포함할 도메인 목록 - exclude_domains (List[str]): 검색 결과에서 제외할 도메인 목록 - include_answer (bool): 원본 쿼리에 대한 짧은 답변 포함 여부 - include_raw_content (bool): 각 사이트의 정제된 HTML 콘텐츠 포함 여부 - include_images (bool): 쿼리 관련 이미지 목록 포함 여부

반환 값 - 검색 결과를 포함하는 JSON 형식의 문자열(url, content) - 혹은 아래의 주석을 해제하고 발급받은 API 키를 입력

# import os

# os.environ["TAVILY_API_KEY"] = "TAVILY API 키 입력"

from langchain_community.tools.tavily_search import TavilySearchResults

# 도구 생성
tool = TavilySearchResults(
    max_results=6,
    include_answer=True,
    include_raw_content=True,
    # include_images=True,
    # search_depth="advanced", # or "basic"
    include_domains=["github.io", "wikidocs.net"],
    # exclude_domains = []
)
# 도구 실행
tool.invoke({"query": "LangChain Tools 에 대해서 알려주세요"})
[
{'url': 'https://teddylee777.github.io/langchain/langchain-agent/',  
'content': '태그:\nAgent,\nAPI KEY,\nFAISS,\nLangChain,\nLangSmith,\nmemory,\nOpenAI,\nPython,\nRetriever,\nTavily Search,\ntools,\n검색도구,\n랭체인,\n에이전트\n카테고리:\nlangchain\n업데이트: 2024년 02월 09일\n참고\nLangChain RAG 파헤치기: 다음의 추적 링크에서 자세한 단계별 수행 결과를 확인할 수 있습니다\nLangSmith 추적\n다음의 추적 링크에서 자세한 단계별 수행 결과를 확인할 수 있습니다\nLangSmith 추적\n④ 메모리 추가하기\n앞서 언급했듯이, 이 에이전트는 상태가 없습니다. LangChain 한국어 튜토리얼\n바로가기 👀\n[LangChain] 에이전트(Agent)와 도구(tools)를 활용한 지능형 검색 시스템 구축 가이드\n2024년 02월 09일\n41 분 소요\n이 글에서는 LangChain 의 Agent 프레임워크를 활용하여 복잡한 검색과 📍 전체 템플릿 코드\n다음의 추적 링크에서 자세한 단계별 수행 결과를 확인할 수 있습니다\nLangSmith 추적\n마무리입니다!\n 문서 기반 QA 시스템 설계 방법 - 심화편\n2024년 02월 06일\n22 분 소요\nLangChain의 RAG 시스템을 통해 문서(PDF, txt, 웹페이지 등)에 대한 질문-답변을 찾는 과정을 정리하였습니다.\n'}, 
{'url': 'https://13akstjq.github.io/TIL/post/2024-07-09-LLMStudyDiaryComprehensiveReviewofLangChainPart4',  'content': 'Memory. 원래 코드는 그대로 작동합니다. Langchain의 다양한 메모리 유형 목록에 대한 링크가 깨져 있어 찾아보았습니다. ... tools=toolkit, verbose=True) agent_executor\xa0...'}, 
{'url': 'https://wikidocs.net/233351',  'content': '또한 LangChain은 포맷하는 동안 렌더링할 메시지를 완전히 제어할 수 있는 MessagePlaceholder 를 제공합니다. 메시지 프롬프트 템플릿에 어떤 역할을 사용해야 할지 확실\xa0...'}, 
{'url': 'https://ncsoft.github.io/ncresearch/f4a00ed849299e3c91fb3244e74ea7f9b974ebb7',  'content': 'Jun 23, 2023 · LangChain은 이런 LLM을 좀 더 쉽게 사용할 수 있도록 개념들을 추상화하여, LLM을 사용하면서 편리할만한 패턴들을 규격화시킨 프레임워크입니다. 이 글\xa0...'}, 
{'url': 'https://13akstjq.github.io/TIL/post/2024-07-12-GenAIwithPythonLLMvsAgents',  'content': 'Jul 12, 2024 · 주요 라이브러리는 다음과 같습니다: LangChain — 거의 모든 LLM 기능을 포함하는 매쉬업 프레임워크입니다. Agent가 낮은 수준에서 코딩되어야 하는 경\xa0...'}, 
{'url': 'https://wikidocs.net/234282',  'content': 'Mar 19, 2024 · langchain 은 언어 모델과 관련된 다양한 기능을 제공하는 라이브러리로, 이 중 검색 도구 생성 기능은 데이터 검색 및 처리 작업을 용이하게 한다.'}]

추가된 TavilySearch 도구 (커스텀 구현)

  • Tavily 검색 API에서 사용되는 주요 파라미터들에 대한 설명
  • 기본 검색 설정
    • query (str): 검색하고자 하는 키워드나 문장
    • search_depth (str): 검색의 상세도. “basic”(기본) 또는 “advanced”(고급) 중 선택
    • topic (str): 검색 주제 분야. “general”(일반) 또는 “news”(뉴스) 중 선택
    • days (int): 검색 결과의 최신성. 지정된 일수 이내의 결과만 반환
    • max_results (int): 반환받을 최대 검색 결과 수
  • 도메인 필터링
    • include_domains (list): 검색 결과에 반드시 포함할 도메인 목록
    • exclude_domains (list): 검색 결과에서 제외할 도메인 목록
  • 결과 상세 설정
    • include_answer (bool): API가 생성한 답변 포함 여부
    • include_raw_content (bool): 웹페이지의 원본 HTML 콘텐츠 포함 여부
    • include_images (bool): 관련 이미지 정보 포함 여부
    • format_output (bool): 검색 결과의 포맷팅 적용 여부
  • 기타
    • **kwargs: 추가적인 키워드 인자. API의 향후 업데이트나 특수 기능에 사용될 수 있음
# !pip install -qU langchain-teddynote

from langchain_teddynote.tools.tavily import TavilySearch

# 기본 예제
tavily_tool = TavilySearch()

# include_domains 사용 예제
# 특정 도메인만 포함하여 검색
tavily_tool_with_domains = TavilySearch(include_domains=["github.io", "naver.com"])

# exclude_domains 사용 예제
# 특정 도메인을 제외하고 검색
tavily_tool_exclude = TavilySearch(exclude_domains=["ads.com", "spam.com"])

# 다양한 파라미터를 사용한 검색 예제
result1 = tavily_tool.search(
    query="유튜버 테디노트에 대해서 알려줘",  # 검색 쿼리
    search_depth="advanced",  # 고급 검색 수준
    topic="general",  # 일반 주제
    days=7,  # 최근 7일 내 결과
    max_results=10,  # 최대 10개 결과
    include_answer=True,  # 답변 포함
    include_raw_content=True,  # 원본 콘텐츠 포함
    include_images=True,  # 이미지 포함
    format_output=True,  # 결과 포맷팅
)

# 뉴스 검색 예제
result2 = tavily_tool.search(
    query="최신 AI 기술 동향",  # 검색 쿼리
    search_depth="basic",  # 기본 검색 수준
    topic="news",  # 뉴스 주제
    days=3,  # 최근 3일 내 결과
    max_results=5,  # 최대 5개 결과
    include_answer=False,  # 답변 미포함
    include_raw_content=False,  # 원본 콘텐츠 미포함
    include_images=False,  # 이미지 미포함
    format_output=True,  # 결과 포맷팅
)

# 특정 도메인 포함 검색 예제
result3 = tavily_tool_with_domains.search(
    query="파이썬 프로그래밍 팁",  # 검색 쿼리
    search_depth="advanced",  # 고급 검색 수준
    max_results=3,  # 최대 3개 결과
)

# 특정 도메인 제외 검색 예제
result4 = tavily_tool_exclude.search(
    query="건강한 식단",  # 검색 쿼리
    search_depth="basic",  # 기본 검색 수준
    days=30,  # 최근 30일 내 결과
    max_results=7,  # 최대 7개 결과
)

# 결과 출력
print("기본 검색 결과:", result1)
print("뉴스 검색 결과:", result2)
print("특정 도메인 포함 검색 결과:", result3)
print("특정 도메인 제외 검색 결과:", result4)

2.4 Image 생성 도구 (DALL-E)

  • DallEAPIWrapper 클래스: OpenAI의 DALL-E 이미지 생성기를 위한 래퍼(wrapper)
  • 이 도구를 사용하면 DALL-E API를 쉽게 통합하여 텍스트 기반 이미지 생성 기능을 구현할 수 있다.
  • 다양한 설정 옵션을 통해 유연하고 강력한 이미지 생성 도구로 활용할 수 있다.

주요 속성

  • model: 사용할 DALL-E 모델 이름 (기본값: “dall-e-2”, “dall-e-3”)
  • n: 생성할 이미지 수 (기본값: 1)
  • size: 생성할 이미지 크기
    • “dall-e-2”: “1024x1024”, “512x512”, “256x256”
    • “dall-e-3”: “1024x1024”, “1792x1024”, “1024x1792”
  • style: 생성될 이미지의 스타일 (기본값: “natural”, “vivid”)
  • quality: 생성될 이미지의 품질 (기본값: “standard”, “hd”)
  • max_retries: 생성 시 최대 재시도 횟수

주요 기능 - DALL-E API를 사용하여 텍스트 설명에 기반한 이미지 생성

흐름 정리

  • 다음은 DALL-E Image Generator 를 사용하여 이미지를 생성하는 예시
  • 이번에는 DallEAPIWrapper 를 사용하여 이미지를 생성
  • 이때 입력 프롬프트는 LLM 모델에게 이미지를 생성하는 프롬프트를 작성하도록 요청
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# ChatOpenAI 모델 초기화
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.9, max_tokens=1000)

# DALL-E 이미지 생성을 위한 프롬프트 템플릿 정의
prompt = PromptTemplate.from_template(
    "Generate a detailed IMAGE GENERATION prompt for DALL-E based on the following description. "
    "Return only the prompt, no intro, no explanation, no chatty, no markdown, no code block, no nothing. Just the prompt"
    "Output should be less than 1000 characters. Write in English only."
    "Image Description: \n{image_desc}",
)

# 프롬프트, LLM, 출력 파서를 연결하는 체인 생성
chain = prompt | llm | StrOutputParser()

# 체인 실행
image_prompt = chain.invoke(
    {"image_desc": "스마트폰을 바라보는 사람들을 풍자한 neo-classicism painting"}
)

# 이미지 프롬프트 출력
print(image_prompt)
Create a neo-classical painting that satirically depicts a group of people intently gazing at their smartphones. The scene should be set in a grand, classical architectural setting with marble columns and intricate details reminiscent of ancient Greece. The figures, dressed in elegant, flowing garments typical of neo-classical art, exhibit exaggerated expressions of fascination and distraction as they interact with their devices. Incorporate elements such as classical sculptures or frescoes in the background that contrast with the modernity of the smartphones. Use soft, natural lighting to enhance the scene, and include subtle hints of irony, perhaps by depicting traditional activities or conversations happening just out of focus, symbolizing the disconnect in modern life.
  • 이전에 생성한 이미지 프롬프트를 DallEAPIWrapper 에 입력하여 이미지를 생성

DallEAPIWrapper 에 대한 임시 버그 안내사항 (작성일: 2024-10-13)

  • 현재 langchain 0.3.x 이상 버전에서 DallEAPIWrapper 에 대한 임시 버그가 있다. (401 오류: invalid API key)
  • 따라서, 아래의 코드를 오류 없이 실행하기 위해서는 LangChain 버전을 0.2.16 으로 변경해야함
  • 아래의 주석을 해제하고 실행하면 LangChain 버전을 0.2.16 으로 변경
  • 하지만, 이후 내용에서는 LangChain 버전을 0.3.x 이상으로 변경하여 사용하기 때문에 poetry shell 명령어를 통해 다시 최신 langchain 버전으로 변경
  • 이 과정이 번거로운 분들은 일단 DallEAPIWrapper 를 사용하지 않고 진행하셔도 무방
  • 업그레이드/다운그레이드 후에는 반드시 상단 메뉴의 “Restart” 버튼을 클릭한 뒤 진행해야함
# 임시 버전 다운그레이드 명령어 (실행 후 restart)
# !pip install langchain==0.2.16 langchain-community==0.2.16 langchain-text-splitters==0.2.4 langchain-experimental==0.0.65 langchain-openai==0.1.20
# DALL-E API 래퍼 가져오기
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
from IPython.display import Image
import os

# DALL-E API 래퍼 초기화
# model: 사용할 DALL-E 모델 버전
# size: 생성할 이미지 크기
# quality: 이미지 품질
# n: 생성할 이미지 수
dalle = DallEAPIWrapper(
    model="dall-e-3",
    size="1024x1024",
    quality="standard",
    n=1,
)

# 질문
query = "스마트폰을 바라보는 사람들을 풍자한 neo-classicism painting"

# 이미지 생성 및 URL 받기
# chain.invoke()를 사용하여 이미지 설명을 DALL-E 프롬프트로 변환
# dalle.run()을 사용하여 실제 이미지 생성
image_url = dalle.run(chain.invoke({"image_desc": query}))

# 생성된 이미지를 표시합니다.
Image(url=image_url, width=500)

3 사용자 정의 도구(Custom Tool)

  • LangChain 에서 제공하는 빌트인 도구 외에도 사용자가 직접 도구를 정의하여 사용할 수 있다.
  • 예를 들어, DB를 조회하는 도구나 날씨를 조회하는 API를 Tool로 만들어 패키징할 수 있음. 즉, LLM이 이 패키징이 된 tool을 사용할 수 있음
  • 이를 위해서는 langchain.tools 모듈에서 제공하는 tool 데코레이터를 사용하여 함수를 도구로 변환

3.1 @tool 데코레이터

  • 이 데코레이터는 함수를 도구로 변환하는 기능을 제공
  • 다양한 옵션을 통해 도구의 동작을 커스터마이즈할 수 있다.

사용 방법 1. 함수 위에 @tool 데코레이터 적용 2. 필요에 따라 데코레이터 매개변수 설정 3. Tool로 만들 함수에 반드시 docstring을 명료하게 작성해야한다. * docstring은 한글보다는 영어를 작성하는 것이 좋다 * docstring은 함수 호출시 어떤 용도로 호출하는지 알려주는 역할을 한다.

  • 이 데코레이터를 사용하면 일반 Python 함수를 강력한 도구로 쉽게 변환할 수 있으며, 자동화된 문서화와 유연한 인터페이스 생성이 가능
from langchain.tools import tool


# 데코레이터를 사용하여 함수를 도구로 변환
@tool
def add_numbers(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b


@tool
def multiply_numbers(a: int, b: int) -> int:
    """Multiply two numbers"""
    return a * b
# 도구 실행
add_numbers.invoke({"a": 3, "b": 4})
7
# 도구 실행
multiply_numbers.invoke({"a": 3, "b": 4})
12

3.2 구글 뉴스기사 검색 도구

langchain-teddynote 패키지에서 제공하는 GoogleNews 도구를 사용하여 구글 뉴스기사를 검색하는 도구

참고 - API 키가 필요하지 않다. (RSS 피드를 사용하기 때문) - 하지만, 과도한 사용시 구글에서 블락할 수 있음

news.google.com 에서 제공하는 뉴스기사를 검색하는 도구

설명 - 구글 뉴스 검색 API를 사용하여 최신 뉴스를 검색 - 키워드를 기반으로 뉴스를 검색할 수 있다. - 최신 뉴스를 검색할 수 있다.

주요 매개변수 - k (int): 반환할 최대 검색 결과 수 (기본값: 5)

# 사용하기 전 패키지를 업데이트
# !pip install -qU langchain-teddynote
from langchain_teddynote.tools import GoogleNews

# 도구 생성
news_tool = GoogleNews()
# 최신 뉴스 검색
news_tool.search_latest(k=5)
[{'url': 'https://news.google.com/rss/articles/CBMid0FVX3lxTE82ZXF0N1g0Tmc0SjdGcTN4T0ZJWE9UTXRJdDJxb0VxVUhUb2t5elFjWjlvcnZJMDZFWVpDMVBsdnozUlRKbXJkSGJSTTJITkF5bTBLekJyN0dYV3E1UDhMN0FQSWo0WGsxMW1Hay1GeWZfaHhkTXVZ0gF3QVVfeXFMTkg4WXh0Xy15VEV2YzRKLUljZEwzZzFlajV1bmdmZ2MzcnRvaGJGbmxmM3gtZFp5a2c4a3Q2cmxPUjNNRTFDdmtzN2h4NnNSUHk3ME9zY3NldmRwWlZqd1UzdzVJOHBwbUxQVTJCdnVrMHhpLTYwdW8?oc=5',  'content': "'조건부 휴학' 승인‥복귀 안 하면 제적·유급 - MBC 뉴스"}, {'url': 'https://news.google.com/rss/articles/CBMid0FVX3lxTE5pWEhEY0Jxd08zQjZ0N3ZySEVDSThRN0NLd2YzV3BRdTZGdmpxbXdpMmZmeE12VWc4cmdQWlJYWGpHMnpua044Y3FmRVZMcEsyU0NsajgycjVlNWI4cU5IRkpGT1ZZbS02LWdpbFhLRVREUGdfQXBV0gFmQVVfeXFMTmU0aU5WV25HTldZSS1JZHVmQmdYZk9PcmtWbXFzNGtLYVRQUmVtMmVHcXN3RHlTem5maENOVFNsYXhlQTFHb0NJM3RsSzg1a1FqeWMyRVJ1Mmp4MUFLZTBRbllyY0FB?oc=5',  'content': '‘한동훈 공격 사주 의혹’ 김대남, SGI서울보증 감사직 사퇴 - 동아일보'}, {'url': 'https://news.google.com/rss/articles/CBMikAFBVV95cUxQWFRFelJKZTdwSjVDRFloNUpNbF83dVVLOXpYSnZ3Y25BS25jQUFWdFhuYklic0lQT0VwbWw0WEU5MGs2Wm83Y1lQLTBJakRrQTFFTEp0T09tNzY3NVpyVGhyRjdpQ2FNV3pVOVZZaFpwNEl1Q2Rtb1laa2VDY1o0NFRxZXFPOWFyUmF3X0NLa1jSAaQBQVVfeXFMTWJJX040anAtYl9lbzRidURVSDNmMGFlc0t4eHZDa1ZJWk14Z0tzNDd4dzBRTFVyZm5HTFEtMHFSajhkci1PUmlYTTdoUC11RUdNMDhWaW9JakszTlhDWkdmNFc2Vk9BUXVoZEt4dG1qOWVicUs1dXd6cWdtSHh6T2ZpcU9CQXFvMHp3ZElpQ1dZYUloT1NpUDVNMTRGcFNmeDBPVlQ?oc=5',  'content': '尹 "한·필리핀 FTA 발효되면 무역·투자 획기적 확대될 것" - 조선일보'}, {'url': 'https://news.google.com/rss/articles/CBMickFVX3lxTE1Pd3RtbzBFOEpERWlqYk5ISnIzaldRQ21XdHcyaW5zMWpQYmNWR2ZveHVLRExncDhNX2oweTBFZlhrUV90OVVodE9xaVhqVFc0S1BFWUs5VFFILUExTVdpWE10QUlKbnBrSEgtSkN6Skl3UQ?oc=5',  'content': '문다혜씨 혈중알코올농도 0.149%…걸어서 파출소 이동 - 한겨레'}, {'url': 'https://news.google.com/rss/articles/CBMickFVX3lxTE9HTU1JajFMeVRPZkViX2EwZkc3R05ySDdWbEJhdjN0QzNnTmo2V0RMbjZQcFI1YTl6dnVHMlpKU0RsODNuRW5TeWYwczBhNjdkNkhiRzc3cWtzQ0wtaHkwU1MwYjNQc2tLX3RjZjdhbEZpQQ?oc=5',  'content': '[단독] 김건희 결혼 후에도 ‘도이치 주식매수’ 정황…흔들리는 윤 해명 - 한겨레'}]
# 키워드로 뉴스 검색
news_tool.search_by_keyword("AI 투자", k=3)
[{'url': 'https://news.google.com/rss/articles/CBMiU0FVX3lxTFB1VDRjTlIxeHRjV3NKaERHMFJLOFNpUlNUVnZzQ0JvOUpISVE2cW9rbTZPVU9lQXZuUURJNHF0aDZyaDdQM0F5NFhsc0NrN1dHNEZz?oc=5',  'content': '글로벌 CEO들 "향후 3년 무조건 AI 투자···직원도 더 뽑을 것" - 네이트 뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiakFVX3lxTE9BQUtjd3pDS1dXRkZQTlo4Y2w2d2laZFFQRXdsbGlCMFRTcWJYLTNLaksxbFlnYzk3clVnYlFxZF93U2xubXY1VVhBTDQ2SDhLbm9hcDdXQ3prTlJtV0VCYTFINmNRbjR5N3c?oc=5',  'content': 'MIT 경제학자 "10년간 AI에 영향받을 직업은 5% 불과...기업은 투자비만 날리게 될 것" - AI타임스'}, {'url': 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9oenZObVAzOV9hbUliNGhkLTBXZXZrTGpvT0ljcXlpWE5leld2b3RLbUJFTFRtZnU4c0VFaC1oYkVvTTdESEZCYmZUTDJSMFFYdGVXeXN3OVdRTEE?oc=5',  'content': 'MS, 이탈리아에 AI 인프라 6조4천억 투자 결정 - 연합뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiYEFVX3lxTE5XdlFLT29uWXR5SmRpS054Z2J3VldjZlJETHJIeVRPakFUNEdiOHh0N0hOU21BRTlHN1haRTBUYnlKUEdVdXJWUWdTbG9vczFHeDNPRG1hSkc2NzVRaVBLQQ?oc=5',  'content': '글로벌 CEO 64% “AI에 최우선 투자” - 아시아경제'}, {'url': 'https://news.google.com/rss/articles/CBMiZEFVX3lxTE02VVREUUxSRExwUkxkY0NGZEw0Z0x0N3FHenZvTXN4TEVlRHEzWEF0SGo4N1Y2Zm8xTE5TaGZDZzNubzFrTmxoUVRiNG9WN01wY2hyUGVyZ1lCS05ua1FLWXYwRTk?oc=5',  'content': '“AI시대 투자 키워드는 ‘공급 부족’...초반 5년이 기회” [헤럴드 머니페스타 2024] - 헤럴드미디어'}]
from langchain_teddynote.tools import GoogleNews
from langchain.tools import tool
from typing import List, Dict


# 키워드로 뉴스 검색하는 도구 생성
@tool
def search_keyword(query: str) -> List[Dict[str, str]]:
    """Look up news by keyword"""
    print(query)
    news_tool = GoogleNews()
    return news_tool.search_by_keyword(query, k=5)
# 실행 결과
search_keyword.invoke({"query": "LangChain AI"})
AI 투자
[{'url': 'https://news.google.com/rss/articles/CBMiU0FVX3lxTFB1VDRjTlIxeHRjV3NKaERHMFJLOFNpUlNUVnZzQ0JvOUpISVE2cW9rbTZPVU9lQXZuUURJNHF0aDZyaDdQM0F5NFhsc0NrN1dHNEZz?oc=5',  'content': '글로벌 CEO들 "향후 3년 무조건 AI 투자···직원도 더 뽑을 것" - 네이트 뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiakFVX3lxTE9BQUtjd3pDS1dXRkZQTlo4Y2w2d2laZFFQRXdsbGlCMFRTcWJYLTNLaksxbFlnYzk3clVnYlFxZF93U2xubXY1VVhBTDQ2SDhLbm9hcDdXQ3prTlJtV0VCYTFINmNRbjR5N3c?oc=5',  'content': 'MIT 경제학자 "10년간 AI에 영향받을 직업은 5% 불과...기업은 투자비만 날리게 될 것" - AI타임스'}, {'url': 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9oenZObVAzOV9hbUliNGhkLTBXZXZrTGpvT0ljcXlpWE5leld2b3RLbUJFTFRtZnU4c0VFaC1oYkVvTTdESEZCYmZUTDJSMFFYdGVXeXN3OVdRTEE?oc=5',  'content': 'MS, 이탈리아에 AI 인프라 6조4천억 투자 결정 - 연합뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiYEFVX3lxTE5XdlFLT29uWXR5SmRpS054Z2J3VldjZlJETHJIeVRPakFUNEdiOHh0N0hOU21BRTlHN1haRTBUYnlKUEdVdXJWUWdTbG9vczFHeDNPRG1hSkc2NzVRaVBLQQ?oc=5',  'content': '글로벌 CEO 64% “AI에 최우선 투자” - 아시아경제'}, {'url': 'https://news.google.com/rss/articles/CBMiZEFVX3lxTE02VVREUUxSRExwUkxkY0NGZEw0Z0x0N3FHenZvTXN4TEVlRHEzWEF0SGo4N1Y2Zm8xTE5TaGZDZzNubzFrTmxoUVRiNG9WN01wY2hyUGVyZ1lCS05ua1FLWXYwRTk?oc=5',  'content': '“AI시대 투자 키워드는 ‘공급 부족’...초반 5년이 기회” [헤럴드 머니페스타 2024] - 헤럴드미디어'}]

Subscribe

Enjoy this blog? Get notified of new posts by email: