function call

짬그브·2025년 6월 13일

Function call

• GPT 모델을 호출할 수 있는 함수(기능)을 설정해두어, 사용자의 요청에 맞게 해당 함수를
호출하는 기능
• 직접 함수를 호출하는 것이 아니고 JSON형식을 이용

from openai import OpenAI

client = OpenAI(api_key="<API KEY>")

messages = [
    {
        'role':'user',
        'content':'오늘 서울 날씨 어때?'
    }
]

functions=[
    {
        "name": "get_current_weather",
        "description": "주어진 지역의 현재 날씨를 알려줍니다.",
        "parameters":{
            "type":"object",
            "properties":{
                "location":{
                    "type":"string",
                    "description":"지역, e.g 서울, 부산, 대구, 제주도"
                },
                "unit":{
                    "type":"string",
                    "enum":["섭씨","화씨"]
                }
            },
                "required":["location"]
        }
    }
]

import json

def get_current_weather(location, unit='섭씨'):
    weather_info= {
        "location" : location,
        "temperature": 30,
        "unit":unit,
        "forecast":["sunny","windy"]
    }

    return json.dumps(weather_info)

response = client.chat.completions.create(
    model='gpt-4o',
    messages=messages,
    functions=functions,
    function_call='auto'
)

print(response)
print()
print(response.choices[0].message)
response_message = response.choices[0].message
if response_message.function_call:
    available_functions = {
        "get_current_weather": get_current_weather
    }

    get_current_weather = response_message.function_call.name
    function_to_call = available_functions[get_current_weather]
    function_args = json.loads(response_message.function_call.arguments)
    function_response = function_to_call(
        location=function_args.get("location"),
        unit=function_args.get("unit")
    )

    messages.append(response_message)
    messages.append(
        {
            'role':'function',
            'name':'get_current_weather',
            'content':function_response
        }
    )

    second_response = client.chat.completions.create(
        model='gpt-4o',
        messages=messages
    )

    print(second_response.choices[0].message.content)

ChatCompletion(id='chatcmpl-BhnU7V6X6cxMhPUiLhfzSbCNZiCzJ', choices=[Choice(finish_reason='function_call', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=FunctionCall(arguments='{"location":"서울","unit":"섭씨"}', name='get_current_weather'), tool_calls=None, annotations=[]))], created=1749778023, model='gpt-4o-2024-08-06', object='chat.completion', service_tier='default', system_fingerprint='fp_a288987b44', usage=CompletionUsage(completion_tokens=20, prompt_tokens=84, total_tokens=104, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))

ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=FunctionCall(arguments='{"location":"서울","unit":"섭씨"}', name='get_current_weather'), tool_calls=None, annotations=[])
서울의 오늘 날씨는 맑고 바람이 조금 불고 있습니다. 기온은 약 30도입니다.

뉴스 검색하기 예제2

from openai import OpenAI
import json

client = OpenAI(api_key="<API KEY>")

import requests
from bs4 import BeautifulSoup

def crawling_google_news(keyword: str, limit=5):
    #https://www.google.com/search?q=%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8%20%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81&tbm=nws&num=5
    google_search_url = 'https://www.google.com/search'

    params = {'q': keyword, 'tbm': 'nws', 'num': limit}

    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
    }

    res = requests.get(google_search_url, params=params, headers=headers)

    soup = BeautifulSoup(res.content, "html.parser")

    news_results = []

    for el in soup.select("div.SoaBEf"):
      news_results.append(
          {
              "link" : el.find("a")["href"],
              "title" : el.select_one("div.MBeuO").get_text(),
              "snippet": el.select_one(".GI74Re").get_text()
          }
      )

    return news_results

results = crawling_google_news('프롬프트 엔지니어링')
# print(json.dumps(results, ensure_ascii=False, indent=2))

def news_call_func(messages, temperature=0, max_tokens=2048):
    functions = [
        {
            "name": "crawling_google_news",
            "description": "구글에서 뉴스를 검색합니다.",
            "parameters":{
                "type":"object",
                "properties":{
                    "keyword":{
                        "type":"string",
                        "description":"구글에 검색할 키워드"
                    }
                },
                "required":["keyword"]
            }
        }
    ]

    response = client.chat.completions.create(
        model='gpt-4o',
        messages=messages,
        functions=functions,
        function_call='auto',
        temperature=temperature,
        max_tokens=max_tokens
    )

    return response.choices[0].message

result = news_call_func([
    {
        'role':'user',
        'content':'한국 경제에 대한 뉴스를 요약해줘'
    }
])
print(result)

arguments = json.loads(result.function_call.arguments)
results = crawling_google_news(arguments['keyword'])
print(json.dumps(results, ensure_ascii=False, indent=2))

result = news_call_func([
    {
        'role':'user',
        'content': json.dumps(results, ensure_ascii=False)
    },
    {
        'role':'user',
        'content': '한국 경제에 대한 뉴스를 요약해줘. 뉴스를 종합하여 제목과 본문이 있는 새로운 글로 작성해줘'
    }
])

print(result.content)




ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=FunctionCall(arguments='{"keyword":"한국 경제"}', name='crawling_google_news'), tool_calls=None, annotations=[])
[
  {
    "link": "https://news.mt.co.kr/mtview.php?no=2025061211252940828",
    "title": "파이어블록스 \"원화 스테이블코인, 무역 중심 한국 경제에 도움\"",
    "snippet": "\"원화 스테이블코인은 무역 중심의 한국 경제에 분명한 이점을 제공할 것입니다. 스테이블코인은 자금을 빠르게 이동할 수 있도록 해 유동성 확보와..."
  },
  {
    "link": "https://www.hani.co.kr/arti/economy/economy_general/1202073.html",
    "title": "한국경제 ‘역성장 확률’ 10년 전보다 3배↑…“저성장 이어진 탓”",
    "snippet": "한국 경제가 분기 기준으로 역성장(마이너스 성장)할 가능성이 10년 전보다 3배 이상 높아진 것으로 분석됐다. 잠재성장률을 밑도는 저성장이 이어..."
  },
  {
    "link": "https://www.wowtv.co.kr/NewsCenter/News/Read?articleId=A202506130268&t=RS",
    "title": "중동 지정학적 리스크, 국내 증시에 단기적 조정 요인",
    "snippet": "핵심 포인트[증시특보] - 국내 증시가 7거래일 연속 상승 후 중동의 지정학적 리스크로 인해 상승 탄력에 제동이 걸림- 이스라엘의 이란 공습 소식이..."
  },
  {
    "link": "https://www.newsis.com/view/NISX20250611_0003208304",
    "title": "\"아이 2명 원하지만\"… 한국, '경제 부담에 출산 포기' 58%로 1위",
    "snippet": "출산을 원하지만 현실적인 제약으로 자녀를 갖지 못하는 경우가 많다는 내용의 유엔 보고서가 발표됐다. 특히 한국은 경제적 이유로 출산을 포기..."
  },
  {
    "link": "https://news.nate.com/view/20250612n13052",
    "title": "[2025 미리경험하는 미래내일] 한국경제TV ESG지원형 사업 '스타트'",
    "snippet": "한눈에 보는 오늘 : 홈 - 뉴스 : [한국경제TV 박준식 기자] 고용노동부와 대한상공회의소가 주관하고 한국경제TV가 운영하는 2025년 미래내일 일경험..."
  }
]
### 한국 경제의 현재와 미래: 도전과 기회

최근 한국 경제는 다양한 도전과 기회를 맞이하고 있습니다. 

먼저, **원화 스테이블코인의 도입**이 주목받고 있습니다. 파이어블록스는 원화 스테이블코인이 무역 중심의 한국 경제에 유동성 확보와 자금 이동의 효율성을 높여줄 것이라고 강조했습니다. 이는 한국 경제의 글로벌 경쟁력을 강화하는 데 기여할 수 있을 것입니다.

그러나 **경제 성장의 둔화**는 여전히 큰 과제로 남아 있습니다. 최근 보고서에 따르면, 한국 경제가 분기 기준으로 역성장할 가능성이 10년 전보다 3배 이상 높아졌습니다. 이는 저성장이 지속된 결과로, 경제 구조의 혁신과 새로운 성장 동력의 발굴이 필요합니다.

또한, **중동의 지정학적 리스크**가 국내 증시에 단기적인 조정 요인으로 작용하고 있습니다. 이스라엘의 이란 공습 소식 등으로 인해 국내 증시의 상승세가 제동이 걸렸습니다. 이러한 외부 요인은 한국 경제의 불확실성을 높이고 있습니다.

한편, **경제적 부담으로 인한 출산 포기**가 사회적 문제로 대두되고 있습니다. 유엔 보고서에 따르면, 한국은 경제적 이유로 출산을 포기하는 비율이 58%로 세계에서 가장 높습니다. 이는 장기적으로 인구 감소와 노동력 부족 문제를 초래할 수 있습니다.

마지막으로, **ESG(환경, 사회, 지배구조) 지원형 사업**이 시작되었습니다. 고용노동부와 대한상공회의소가 주관하고 한국경제TV가 운영하는 이 사업은 지속 가능한 경제 발전을 위한 새로운 기회를 제공할 것입니다.

이처럼 한국 경제는 다양한 도전과 기회를 맞이하고 있으며, 이를 어떻게 극복하고 활용하느냐에 따라 미래의 경제적 성패가 결정될 것입니다.

종료 코드 0(으)로 완료된 프로세스

Langchain

인터프리터에 설치 잘 되어있는지 확인

리트리버 사용하기

import os

os.environ['OPENAI_API_KEY'] = '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'

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model='gpt-4o')

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="너는 미녀와 야수에 나오는 미녀야. 그 캐릭터에 맞게 사용자와 대화해줘"),
    HumanMessage(content="안녕? 저는 개스톤입니다. 오늘 시간괜찮으시면 저녁 같이 먹을까요?")
]

# print(model.invoke(messages).content)

from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()
# result = model.invoke(messages)
# print(result)
# print(parser.invoke(result))
# print()

chain = model | parser
print(chain.invoke(messages))

from langchain_core.prompts import ChatPromptTemplate

system_template = '너는 {story}에 나오는 {character_a}의 역할이다. 그 캐릭터에 맞게 사용자와 대화하라.'
human_template = '안녕? 저는 {character_b}입니다. 오늘 시간 괜찮으시면 {activity} 같이 할까요?'

prompt_template = ChatPromptTemplate([
    ('system', system_template),
    ('user', human_template)
])

# result = prompt_template.invoke({
#     'story':'미녀와 야수',
#     'character_a':'미녀',
#     'character_b':'야수',
#     'activity':'저녁'
# })

# print(result)

chain = prompt_template | model | parser

result = chain.invoke({
    'story':'미녀와 야수',
    'character_a':'미녀',
    'character_b':'야수',
    'activity':'저녁'
})
print(result)


안녕하세요, 개스톤. 초대해 주셔서 고마워요. 하지만 오늘은 아버지를 돌봐야 해서 시간이 안 될 것 같아요. 대신 친구로서 마을 행사에서 보는 건 어떨까요? 저희 마을에 필요한 일들을 함께 도와줄 수 있을테니 좋을 것 같아요.
안녕하세요, 야수님! 오늘 저녁 너무 좋죠. 무엇을 먹으면 좋을까요? 그리고 어떻게 지내셨는지도 궁금해요.

종료 코드 0(으)로 완료된 프로세스

langchain 2

import os

os.environ['OPENAI_API_KEY'] = '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'

from langchain_community.retrievers import WikipediaRetriever

# retriever = WikipediaRetriever(lang='ko')
# documents = retriever.invoke("대형 언어 모델")
# print(documents)
# print()
#
# for document in documents:
#     print('--------------------------------검색한 메타 데이터-----------------------------------------')
#     print(document.metadata)
#     print('--------------------------------검색한 텍스트 ---------------------------------------------')
#     print(document.page_content)
#     print()

retriever = WikipediaRetriever(
    lang='ko',
    top_k_results=3,
    doc_content_chars_max=500
)

documents = retriever.invoke('맥주는 무슨 술인가요?')

for document in documents:
    print('--------------------------------검색한 메타 데이터-----------------------------------------')
    print(document.metadata)
    print('--------------------------------검색한 텍스트 ---------------------------------------------')
    print(document.page_content)
    print()

from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

chat = ChatOpenAI(model='gpt-4o')

retriever = WikipediaRetriever(
    lang='ko',
    doc_content_chars_max=500,
    top_k_results=2
)


chain = RetrievalQA.from_llm(
    llm=chat,
    retriever=retriever,
    return_source_documents=True
)

result = chain.invoke("소주란?")
print(result)
print(result['result'])
print(result['source_documents'])

--------------------------------검색한 메타 데이터-----------------------------------------
{'title': '맥주', 'summary': "맥주(麥酒, 독일어: bier, 영어: beer)는 보리를 가공한 맥아(麥芽)를 발효한 술로서 알코올은 맥주의 종류에 따라, 2 ~ 8% 정도의 다양한 도수를 가진 술이다. 맥주의 어원은 '마신다'라는 의미의 라틴어 비베레(bibere)에서 유래하였다.\n맥주는 고대 문명에서 농업의 번창함을 표현한 인류학적 증거라는 견해가 있다.\n맥주는 기원전 3000년부터 양조되어, 세계에서 가장 오래된 알코올 음료로 알려져 있다. 수메르, 아시리아, 바빌로니아, 이집트 등지에서 보리와 밀을 경작하면서 맥주의 양조가 발달되었다. 함무라비 법전에서도 맥주에 관한 법률이 나와 있다.\n\n", 'source': 'https://ko.wikipedia.org/wiki/%EB%A7%A5%EC%A3%BC'}
--------------------------------검색한 텍스트 ---------------------------------------------
맥주(麥酒, 독일어: bier, 영어: beer)는 보리를 가공한 맥아(麥芽)를 발효한 술로서 알코올은 맥주의 종류에 따라, 2 ~ 8% 정도의 다양한 도수를 가진 술이다. 맥주의 어원은 '마신다'라는 의미의 라틴어 비베레(bibere)에서 유래하였다.
맥주는 고대 문명에서 농업의 번창함을 표현한 인류학적 증거라는 견해가 있다.
맥주는 기원전 3000년부터 양조되어, 세계에서 가장 오래된 알코올 음료로 알려져 있다. 수메르, 아시리아, 바빌로니아, 이집트 등지에서 보리와 밀을 경작하면서 맥주의 양조가 발달되었다. 함무라비 법전에서도 맥주에 관한 법률이 나와 있다.


== 역사 ==


=== 총괄 ===
맥주는 인류가 유목 생활에서 정착 생활로 전환해 농경 생활을 하면서부터 만들어진 음료이다. 기원전 4000년경 메소포타미아의 수메르인들에 의해 탄생했다는 것이 현재 정설로 받아들여지고 있다. 수메르인들은 곡물로 만든 빵을 분쇄한 다음 맥아를 넣고 물을 부은 뒤 발효시키는 방법으로 

--------------------------------검색한 메타 데이터-----------------------------------------
{'title': '대한민국의 맥주', 'summary': '맥주는 20세기 초에 한국에 처음 소개되었다. 1908년에 서울 최초의 맥주 양조장이 문을 열었다. 현재 두 개의 주요 양조장은 1930년대로 거슬러 올라간다. 국내 세 번째 양조장인 진로 쿠어스맥주는 1990년대에 설립되었다. 이후 OB 맥주에 인수되었다. 하이트맥주의 옛 이름은 1933년에 설립된 조선주조였다. 1998년 하이트맥주로 사명을 변경했다. OB 맥주는 1933년에 쇼와기린맥주라는 이름으로 설립되었다. 1995년에는 OB 맥주로 이름을 변경했다.\n현재 한국 맥주 시장은 하이트진로 와 오비 라는 두 개의 주요 제조업체가 지배하고 있으며 여러 브랜드가 국내 시장에서 판매되고 있다. 한국의 대부분의 식당과 술집은 이 맥주 브랜드 중 하나(하이트나 OB의 카스)만 있는데, 이는 맛과 가격이 대체로 비슷하다고 여겨지기 때문이다(대부분 쌀로 양조한다). 수입 맥주는 한국에서 널리 구할 수 있지만 일반적으로 비싸다. 서울 시내 술집에서 기네스 파인트의 경우 일반적으로 최소 8,000 원 에서 최대 15,000원인 반면 국내 브랜드의 경우 약 3,000원이다. 최근에 , 소규모 양조장이 전국적으로 생겨나면서 점점 더 정교해지는 조짐을 보이고 있다. 국내 대량생산 맥주 중 100% 보리 맥아로 양조하는 맥주는 맥스(하이트)와 오비 골든라거 2종뿐이다.\n국내 시장에서 소규모 양조장이 부족한 것은 정부의 까다로운 규제 때문으로 풀이된다. 이것은 소규모 양조업자들이 그들의 소유권 아래 있는 장소에 맥주를 공급하는 것을 제한했다. 이러한 법은 2011년 6월에 완화되어 몇몇 소규모 업체들이 지역 맥주 시장에서 점유율을 확보하게 되었다.\n한국에서 성장하는 트렌드는 홈브루잉이다. 재료와 공급품은 여전히 제한되어 있지만 많은 가정에서 직접 맥주를 양조하고 있다. 한국에는 홈브루킹의 과정을 안내하기 위한 다양한 양조 클럽들이 존재한다. 그러한 클럽 중 하나가 홈브루 코리아이다.', 'source': 'https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EB%A7%A5%EC%A3%BC'}
--------------------------------검색한 텍스트 ---------------------------------------------
맥주는 20세기 초에 한국에 처음 소개되었다. 1908년에 서울 최초의 맥주 양조장이 문을 열었다. 현재 두 개의 주요 양조장은 1930년대로 거슬러 올라간다. 국내 세 번째 양조장인 진로 쿠어스맥주는 1990년대에 설립되었다. 이후 OB 맥주에 인수되었다. 하이트맥주의 옛 이름은 1933년에 설립된 조선주조였다. 1998년 하이트맥주로 사명을 변경했다. OB 맥주는 1933년에 쇼와기린맥주라는 이름으로 설립되었다. 1995년에는 OB 맥주로 이름을 변경했다.
현재 한국 맥주 시장은 하이트진로 와 오비 라는 두 개의 주요 제조업체가 지배하고 있으며 여러 브랜드가 국내 시장에서 판매되고 있다. 한국의 대부분의 식당과 술집은 이 맥주 브랜드 중 하나(하이트나 OB의 카스)만 있는데, 이는 맛과 가격이 대체로 비슷하다고 여겨지기 때문이다(대부분 쌀로 양조한다). 수입 맥주는 한국에서 널리 구할 수 있지만 일반적으로 비싸다. 서울 시내 술집에서 기네스 파인트의 경우 일반적으로 최소 8,00

--------------------------------검색한 메타 데이터-----------------------------------------
{'title': '효모', 'summary': '효모(酵母) 또는 이스트(영어: yeast) 또는 뜸팡이는 균계에 속하는 미생물로 약 1,500 종이 알려져 있다. 대부분 출아에 의해 생식하나 세포 분열을 하는 종도 있다. 크기는 대략 3~4 마이크로미터로 하나의 세포로 이루어진 단세포 생물이다. 흔히 빵이나 맥주의 발효에 이용된다. 효모를 처음으로 관찰하고 분리·배양한 사람은 1680년에 맥주효모를 발견한 네덜란드의 현미경 발명자 레이엔후크(Leeuwenhoek)이다.\n\n', 'source': 'https://ko.wikipedia.org/wiki/%ED%9A%A8%EB%AA%A8'}
--------------------------------검색한 텍스트 ---------------------------------------------
효모(酵母) 또는 이스트(영어: yeast) 또는 뜸팡이는 균계에 속하는 미생물로 약 1,500 종이 알려져 있다. 대부분 출아에 의해 생식하나 세포 분열을 하는 종도 있다. 크기는 대략 3~4 마이크로미터로 하나의 세포로 이루어진 단세포 생물이다. 흔히 빵이나 맥주의 발효에 이용된다. 효모를 처음으로 관찰하고 분리·배양한 사람은 1680년에 맥주효모를 발견한 네덜란드의 현미경 발명자 레이엔후크(Leeuwenhoek)이다.


== 특징 ==
달걀 모양과 유사한 단세포체이다. 진핵생물에 속하나 원형의 DNA 구조인 플라스미드(plasmid)를 포함하고 있다. 보통 출아법과 이분법의 무성생식을 통한 번식도 하나, 유성생식으로 번식하기도 한다.
단상의 1핵을 가진 2개의 세포 사이에서 접합이 이루어지는데, 단상 생물인 경우에는 핵이 합쳐져 형성된 복상핵이 바로 감수 분열을 하여 4 ~ 8개의 자낭 포자를 만들어 단상으로 되돌아간다. 한편, 단복상 생물은 복상핵을 가진 채 생활하다가 출아
profile
+AI to AI+

0개의 댓글