https://wikidocs.net/book/14314
를 참고하여 학습하였습니다.
1.Tools
특정 작업을 수행하거나, 정보를 검색하고, 데이터를 처리하는 데 사용되는 도구
(특정 작업(예: 데이터베이스 조회, API 호출, 파일 읽기 등)을 수행하기 위해 에이전트가 사용하는 인터페이스)
https://python.langchain.com/v0.1/docs/integrations/tools/
Tools | 🦜️🔗 LangChain
📄️ Python REPL Sometimes, for complex calculations, rather than have an LLM generate the answer directly, it can be better to have the LLM generate code to calculate the answer, and then run that code to get the answer. In order to easily do that, we
python.langchain.com
from langchain_teddynote.tools import GoogleNews
from langchain.tools import tool
@tool
def find_News_ByKeyWords(keyword :str):
"""
키워드로 받은 뉴스 데이터 상위 5개를 반환하는 함수입니다.
"""
tool = GoogleNews()
return tool.search_by_keyword(keyword, k=5)
print(find_News_ByKeyWords("애니메이션"))
[{'url': 'https://news.google.com/rss/articles/CBMiVkFVX3lxTFBfRUt4SWJsel9CWG93VmtqTmZKWlg1a1F4YUZkVDBVOTN0d3VQV0lucm0yXzV4aVJYUm5haTg2eFlTVGtnX1BuS19fU3BGT29yVzk2Rjln?oc=5', 'content': "[K컬처 리포트] 백희나 그림책 '알사탕'을 일본서 애니메이션 만든 까닭 - 비즈한국"}, {'url': 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9VS3MwUUtCa3NzbGJDc2QtTHJod1FoVGR1dTN3bXI4TUZxSUtXbEJsc2hhNzUxZzFNNUNQS3FqcWNGMFl3aXFiRmpJMmhBWEg2dWFkTWNtSExiMWc?oc=5', 'content': '123만 동원 인기 애니메이션 ‘사랑의 하츄핑’, 판타지 뮤지컬로 재탄생 - KBS뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiYkFVX3lxTE53VHhMUGY2R2xZbjNRRXpacGx2cVhRbzR2UE83emZFQ2RqcjVKVkxxUXExMVRLMVZVVlBBR3N2ZmpWcjJ6UmsyYnJFZTZvaGk3OE05OERGSmo3ZVhmYi1pZVZ3?oc=5', 'content': "'슈퍼 엘프: 빨간모자 비밀요정', 짱구-소닉-뽀로로 제치고 애니메이션 예매율 1위! 오늘(15일) 개봉 & 관람 포인트 BEST 3 공개! - RNX뉴스"}, {'url': 'https://news.google.com/rss/articles/CBMiVEFVX3lxTE0yWllqN2J3WG1NMWJNSkxGWUdxT1lPMlEtcTdneVk3UGlqd3hSZ19RemxfTkFyOEsxdzljQWk5c3p3LVhSQThpbnhNaHhJLTVoTDZfWNIBWEFVX3lxTE9aNWN3U0dybzZWX2s5OW1vekhqZ2ZEdXItUWxCX1NVTVhMSXVxaWN1azN1LTllczFsTGZCQ2Y5UVpYN1RyMFVjYzlMbmdLcHFadXRqVlJwYlk?oc=5', 'content': "'따뜻한 영상을 굽는' 토스트 애니메이션 스튜디오 장인복 대표 - 전북일보"}, {'url': 'https://news.google.com/rss/articles/CBMibEFVX3lxTE5GSWx0VnNrNExCUl9LeGF3UTNoWXJmWWtqNFlZMUxMUTU5akJTeVlkcGNpLW9PazNwQVh5T2Y4X0tnaFpEMHlWVlA4NVZraWpLX3VhNGE0RlhTZDBqTEtyZW5HLVJHeHhUNUxYMNIBcEFVX3lxTE5vOHh6WnFMUUhiRkJIMnYyYjEzVkRya1RHOE1jM2ZNYnk5UXV2OGFQU3lfMVgyWjJUUFllT3dpTTk3bTVlTzJYcWRFV3h6WFBRT284Vjhjcl9hNWVvZFIwQ3VSR2F6aTZWVmVmSkdxNjM?oc=5', 'content': "‘오버로드’ 애니메이션 기반 게임 '오버로드 나자릭의 왕', 정식 출시 - 경향게임스"}]
1.@tool 데코레이터
사용자 정의 함수를 LangChain의 에이전트가 사용할 수 있는 도구로 변환한다.
description을 제공하지않으면 반드시 docstring을 추가해야한다.
@tool
def find_News_ByKeyWords(keyword :str):
"""
키워드로 받은 뉴스 데이터 상위 5개를 반환하는 함수입니다.
"""
tool = GoogleNews()
return tool.search_by_keyword(keyword, k=5)
@tool(description="키워드로 받은 뉴스 데이터 상위 5개를 반환하는 함수입니다.")
def find_News_ByKeyWords(keyword :str):
tool = GoogleNews()
return tool.search_by_keyword(keyword, k=5)
2.Agent 사용
2-1. 도구정의
Agent가 사용할수있는 도구를 정의해준다.
#도구들정의
@tool
def find_News_ByKeyWords(keyword :str):
"""
A tool that returns the top five news data received as keywords.
"""
tool = GoogleNews()
return tool.search_by_keyword(keyword, k=5)
@tool
def extract_urls(news_data):
"""
Extract only 'url' from each news item and return it to the list
"""
urls = re.findall(r'https?://[^\s,\'"]+', news_data)
return urls
tools = [extract_urls,find_News_ByKeyWords]
2-2.LLM, Agent 정의
llm과 agent를 생성해준다.
zero-shot-react-description 방법은 질문에 대해 미리 학습된 모델을 사용하여 자동으로 답변을 생성하는 방식이다.
llm = OllamaLLM(model="llama3.1")
agent = initialize_agent(
tools=tools,
llm=llm,
agent_type="zero-shot-react-description", # 에이전트 타입 설정
verbose=True,
handle_parsing_errors=True,
max_iterations=2
)
2-3.결과
from langchain_teddynote.tools import GoogleNews
from langchain.tools import tool
from langchain_ollama import OllamaLLM
from langchain.agents import initialize_agent
import re
#도구들정의
@tool
def find_News_ByKeyWords(keyword :str):
"""
A tool that returns the top five news data received as keywords.
"""
tool = GoogleNews()
return tool.search_by_keyword(keyword, k=5)
@tool
def extract_urls(news_data):
"""
Extract only 'url' from each news item and return it to the list
"""
urls = re.findall(r'https?://[^\s,\'"]+', news_data)
return urls
tools = [extract_urls,find_News_ByKeyWords]
llm = OllamaLLM(model="llama3.1")
agent = initialize_agent(
tools=tools,
llm=llm,
agent_type="zero-shot-react-description", # 에이전트 타입 설정
verbose=True,
handle_parsing_errors=True,
max_iterations=2
)
question = "애니메이션에 대한 기사 5개를 찾은다음 url을 찾아주세요"
response = agent.run(question)
print(response)
> Entering new AgentExecutor chain...
Action: find_News_ByKeyWords
Action Input: "애니메이션"
Observation: [{'url': 'https://news.google.com/rss/articles/CBMiVkFVX3lxTFBfRUt4SWJsel9CWG93VmtqTmZKWlg1a1F4YUZkVDBVOTN0d3VQV0lucm0yXzV4aVJYUm5haTg2eFlTVGtnX1BuS19fU3BGT29yVzk2Rjln?oc=5', 'content': "[K컬처 리포트] 백희나 그림책 '알사탕'을 일본서 애니메이션 만든 까닭 - 비즈한국"}, {'url': 'https://news.google.com/rss/articles/CBMiZkFVX3lxTE9BZTRxZGpjczVxeDVOcUtCVEJyNmFuQmRtdFBYZW1vTDk4UTMwMnd4NXlyd1NEampGZFk1Y2w1UnRrcW4tVUJQSmxtb1hzeTRDYzNNLWNmOFBkNkNORElYemtpM3RVQdIBbkFVX3lxTE1TbkxWRHdRb3ljVHBkN3ptaEczdmVQTmt5cGR0cGJBZ0Q2UVhIVWFjbWtLSlhYYWpIb2M0ZW5BYTRLek1nUUUtREV1RVdab3V0X0hoNy0zeHN2X2xhd3NUQWRyWEVBZ1Y5MlhZX2NR?oc=5', 'content': '또봉 이통닭, 숏드라마와 애니메이션으로 새로운 모습 선보여 - 머니투데이'}, {'url': 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9VS3MwUUtCa3NzbGJDc2QtTHJod1FoVGR1dTN3bXI4TUZxSUtXbEJsc2hhNzUxZzFNNUNQS3FqcWNGMFl3aXFiRmpJMmhBWEg2dWFkTWNtSExiMWc?oc=5', 'content': '123만 동원 인기 애니메이션 ‘사랑의 하츄핑’, 판타지 뮤지컬로 재탄생 - KBS뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiYkFVX3lxTE53VHhMUGY2R2xZbjNRRXpacGx2cVhRbzR2UE83emZFQ2RqcjVKVkxxUXExMVRLMVZVVlBBR3N2ZmpWcjJ6UmsyYnJFZTZvaGk3OE05OERGSmo3ZVhmYi1pZVZ3?oc=5', 'content': "'슈퍼 엘프: 빨간모자 비밀요정', 짱구-소닉-뽀로로 제치고 애니메이션 예매율 1위! 오늘(15일) 개봉 & 관람 포인트 BEST 3 공개! - RNX뉴스"}, {'url': 'https://news.google.com/rss/articles/CBMiVEFVX3lxTE0yWllqN2J3WG1NMWJNSkxGWUdxT1lPMlEtcTdneVk3UGlqd3hSZ19RemxfTkFyOEsxdzljQWk5c3p3LVhSQThpbnhNaHhJLTVoTDZfWNIBWEFVX3lxTE9aNWN3U0dybzZWX2s5OW1vekhqZ2ZEdXItUWxCX1NVTVhMSXVxaWN1azN1LTllczFsTGZCQ2Y5UVpYN1RyMFVjYzlMbmdLcHFadXRqVlJwYlk?oc=5', 'content': "'따뜻한 영상을 굽는' 토스트 애니메이션 스튜디오 장인복 대표 - 전북일보"}]
Thought:Action: extract_urls
Action Input: Observation: [{'url': 'https://news.google.com/rss/articles/CBMiVkFVX3lxTFBfRUt4SWJsel9CWG93VmtqTmZKWlg1a1F4YUZkVDBVOTN0d3VQV0lucm0yXzV4aVJYUm5haTg2eFlTVGtnX1BuS19fU3BGT29yVzk2Rjln?oc=5'}, {'url': 'https://news.google.com/rss/articles/CBMiZkFVX3lxTE9BZTRxZGpjczVxeDVOcUtCVEJyNmFuQmRtdFBYZW1vTDk4UTMwMnd4NXlyd1NEampGZFk1Y2w1UnRrcW4tVUJQSmxtb1hzeTRDYzNNLWNmOFBkNkNORElYemtpM3RVQdIBbkFVX3lxTE1TbkxWRHdRb3ljVHBkN3ptaEczdmVQTmt5cGR0cGJBZ0Q2UVhIVWFjbWtLSlhYYWpIb2M0ZW5BYTRLek1nUUUtREV1RVdab3V0X0hoNy0zeHN2X2xhd3NUQWRyWEVBZ1Y5MlhZX2NR?oc=5'}, {'url': 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9VS3MwUUtCa3NzbGJDc2QtTHJod1FoVGR1dTN3bXI4TUZxSUtXbEJsc2hhNzUxZzFNNUNQS3FqcWNGMFl3aXFiRmpJMmhBWEg2dWFkTWNtSExiMWc?oc=5'}, {'url': 'https://news.google.com/rss/articles/CBMiYkFVX3lxTE53VHhMUGY2R2xZbjNRRXpacGx2cVhRbzR2UE83emZFQ2RqcjVKVkxxUXExMVRLMVZVVlBBR3N2ZmpWcjJ6UmsyYnJFZTZvaGk3OE05OERGSmo3ZVhmYi1pZVZ3?oc=5'}, {'url': 'https://news.google.com/rss/articles/CBMiVEFVX3lxTE0yWllqN2J3WG1NMWJNSkxGWUdxT1lPMlEtcTdneVk3UGlqd3hSZ19RemxfTkFyOEsxdzljQWk5c3p3LVhSQThpbnhNaHhJLTVoTDZfWNIBWEFVX3lxTE9aNWN3U0dybzZWX2s5OW1vekhqZ2ZEdXItUWxCX1NVTVhMSXVxaWN1azN1LTllczFsTGZCQ2Y5UVpYN1RyMFVjYzlMbmdLcHFadXRqVlJwYlk?oc=5'}]
Thought: Now that I have the URLs, I can extract them
Action: extract_urls
Action Input: Observation: ['https://news.google.com/rss/articles/CBMiVkFVX3lxTFBfRUt4SWJsel9CWG93VmtqTmZKWlg1a1F4YUZkVDBVOTN0d3VQV0lucm0yXzV4aVJYUm5haTg2eFlTVGtnX1BuS19fU3BGT29yVzk2Rjln?oc=5', 'https://news.google.com/rss/articles/CBMiZkFVX3lxTE9BZTRxZGpjczVxeDVOcUtCVEJyNmFuQmRtdFBYZW1vTDk4UTMwMnd4NXlyd1NEampGZFk1Y2w1UnRrcW4tVUJQSmxtb1hzeTRDYzNNLWNmOFBkNkNORElYemtpM3RVQdIBbkFVX3lxTE1TbkxWRHdRb3ljVHBkN3ptaEczdmVQTmt5cGR0cGJBZ0Q2UVhIVWFjbWtLSlhYYWpIb2M0ZW5BYTRLek1nUUUtREV1RVdab3V0X0hoNy0zeHN2X2xhd3NUQWRyWEVBZ1Y5MlhZX2NR?oc=5', 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9VS3MwUUtCa3NzbGJDc2QtTHJod1FoVGR1dTN3bXI4TUZxSUtXbEJsc2hhNzUxZzFNNUNQS3FqcWNGMFl3aXFiRmpJMmhBWEg2dWFkTWNtSExiMWc?oc=5', 'https://news.google.com/rss/articles/CBMiYkFVX3lxTE53VHhMUGY2R2xZbjNRRXpacGx2cVhRbzR2UE83emZFQ2RqcjVKVkxxUXExMVRLMVZVVlBBR3N2ZmpWcjJ6UmsyYnJFZTZvaGk3OE05OERGSmo3ZVhmYi1pZVZ3?oc=5', 'https://news.google.com/rss/articles/CBMiVEFVX3lxTE0yWllqN2J3WG1NMWJNSkxGWUdxT1lPMlEtcTdneVk3UGlqd3hSZ19RemxfTkFyOEsxdzljQWk5c3p3LVhSQThpbnhNaHhJLTVoTDZfWNIBWEFVX3lxTE9aNWN3U0dybzZWX2s5OW1vekhqZ2ZEdXItUWxCX1NVTVhMSXVxaWN1azN1LTllczFsTGZCQ2Y5UVpYN1RyMFVjYzlMbmdLcHFadXRqVlJwYlk?oc=5']
Thought: Now that I have the list of URLs, I can extract them
Action:
Result: ['https://news.google.com/rss/articles/CBMiVkFVX3lxTFBfRUt4SWJsel9CWG93VmtqTmZKWlg1a1F4YUZkVDBVOTN0d3VQV0lucm0yXzV4aVJYUm5haTg2eFlTVGtnX1BuS19fU3BGT29yVzk2Rjln?oc=5', 'https://news.google.com/rss/articles/CBMiZkFVX3lxTE9BZTRxZGpjczVxeDVOcUtCVEJyNmFuQmRtdFBYZW1vTDk4UTMwMnd4NXlyd1NEampGZFk1Y2w1UnRrcW4tVUJQSmxtb1hzeTRDYzNNLWNmOFBkNkNORElYemtpM3RVQdIBbkFVX3lxTE1TbkxWRHdRb3ljVHBkN3ptaEczdmVQTmt5cGR0cGJBZ0Q2UVhIVWFjbWtLSlhYYWpIb2M0ZW5BYTRLek1nUUUtREV1RVdab3V0X0hoNy0zeHN2X2xhd3NUQWRyWEVBZ1Y5MlhZX2NR?oc=5', 'https://news.google.com/rss/articles/CBMiW0FVX3lxTE9VS3MwUUtCa3NzbGJDc2QtTHJod1FoVGR1dTN3bXI4TUZxSUtXbEJsc2hhNzUxZzFNNUNQS3FqcWNGMFl3aXFiRmpJMmhBWEg2dWFkTWNtSExiMWc?oc=5', 'https://news.google.com/rss/articles/CBMiYkFVX3lxTE53VHhMUGY2R2xZbjNRRXpacGx2cVhRbzR2UE83emZFQ2RqcjVKVkxxUXExMVRLMVZVVlBBR3N2ZmpWcjJ6UmsyYnJFZTZvaGk3OE05OERGSmo3ZVhmYi1pZVZ3?oc=5', 'https://news.google.com/rss/articles/CBMiVEFVX3lxTE0yWllqN2J3WG1NMWJNSkxGWUdxT1lPMlEtcTdneVk3UGlqd3hSZ19RemxfTkFyOEsxdzljQWk5c3p3LVhSQThpbnhNaHhJLTVoTDZfWNIBWEFVX3lxTE9aNWN3U0dybzZWX2s5OW1vekhqZ2ZEdXItUWxCX1NVTVhMSXVxaWN1azN1LTllczFsTGZCQ2Y5UVpYN1RyMFVjYzlMbmdLcHFadXRqVlJwYlk?oc=5']
반응형
'AI' 카테고리의 다른 글
[AI] LLAMA 파인튜닝 해보기 (0) | 2025.01.17 |
---|---|
[LangChain] RAG(Retrieval-Augmented Generation) (0) | 2025.01.15 |
[LangChain] HuggingFace API Key 발급, HuggingFace 모델 LangChain에서사용 (0) | 2025.01.13 |