Data Navigator

Langchain, OpenAI API, Programmable Search Engine로 검색어 기반 자동 기사 작성 프로그램 만들기02 본문

Python

Langchain, OpenAI API, Programmable Search Engine로 검색어 기반 자동 기사 작성 프로그램 만들기02

코딩하고분석하는돌스 2024. 11. 13. 17:27

Langchain, OpenAI API, Programmable Search Engine로 
검색어 기반 자동 기사 작성 프로그램 만들기02

 

 

 

Google Programmable Search Engine 에서 검색 엔진 ID, API key 발급받기를 완료했다면 최신 정보에 기반한 뉴스 기사를 생성하는 프로그램을 만들어 보자.

 

1. 필요 라이브러리 임포트

from langchain.agents import Tool, create_openai_tools_agent, AgentExecutor
from langchain_community.utilities import GoogleSearchAPIWrapper
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI

 

 

2. 검색엔진ID와 Google api key 가 환경변수에서 제대로 로딩되는지 체크

import os

if "GOOGLE_CSE_ID" not in os.environ:
    print("GOOGLE_CSE_ID가 설정되어 있지 않습니다.")
else:
    print("GOOGLE_CSE_ID가 설정되어 있습니다.")
    
if "GOOGLE_API_KEY" not in os.environ:
    print("GOOGLE_API_KEY가 설정되어 있지 않습니다.")
else:
    print("GOOGLE_API_KEY가 설정되어 있습니다.")

 

3. GPT에게 전달할 프롬프트 생성 함수 작성

def create_prompt():
    template = ChatPromptTemplate.from_messages([
        ("system", "당신은 뉴스 기사를 쓰는 블로거입니다. 다음 주제에 대해 구글 검색을 통해 최신 정보를 얻고, 그 정보를 바탕으로 뉴스 기사를 작성해 주세요. 1000자 이상, 한국어로 출력해 주세요. 기사 말미에 참고한 URL을 참조 출처로 제목과 URL을 출력해 주세요."),
        ("human", "{theme}"),
        MessagesPlaceholder("agent_scratchpad"),
    ])
    return template

 

 

4. 랭체인에 구글 검색 기능을 도구로 추가

def define_tools():
    search = GoogleSearchAPIWrapper()
    return [
        Tool(
            name="Search",
            func=search.run,
            description="useful for then you need to answer questions about current events. You should ask targeted questions"
        ),
    ]

 

  • search = GoogleSearchAPIWrapper():
    • GoogleSearchAPIWrapper는 LangChain의 Google 검색 API 래퍼 클래스이다.
    • 이 인스턴스는 Google API 키(GOOGLE_API_KEY)와 Custom Search Engine ID(GOOGLE_CSE_ID)를 사용하여 Google 검색 기능을 제공한다.
    • 이 인스턴스를 통해 OpenAI 모델이 Google 검색을 수행할 수 있다.
  • Tool 클래스 사용:
    • Tool 클래스는 LangChain에서 도구를 정의할 때 사용된다.
    • Tool 인스턴스를 통해 GoogleSearchAPIWrapper의 run 메서드를 Search라는 이름의 도구로 등록한다.
  • Tool의 인수:
    • name="Search": 도구의 이름을 "Search"로 지정하여, 이후 에이전트가 이 도구를 호출할 때 사용한다.
    • func=search.run: GoogleSearchAPIWrapper의 run 메서드를 Search 도구의 기능으로 설정한다. 이를 통해 검색 기능이 실행된다.
    • description: 도구의 설명을 정의하며, 이 도구가 언제 유용한지와 사용하는 방법에 대한 정보를 포함한다. 이 설명은 LangChain의 에이전트가 Search 도구를 사용할 때 참조한다.

 

 

5. GPT에 검색결과를 넘겨서 받은 결과를 화면에 출력하고 txt 파일로 저장하는 함수

def write_response_to_file(response, filename):
    with open(filename, 'w', encoding='utf-8') as file:
        file.write(response)
    print(response)
    print("출력이 완료되었습니다.")

 

 

6. 검색어를 입력받고 랭체인, OpenAI API를 이용해 기사를 생성하는 코드 실행

llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo", max_tokens=2000)
tools = define_tools()
prompt = create_prompt()
agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)

response = agent_executor.invoke({"theme": input("기사 주제를 입력해 주세요: ")})
write_response_to_file(response['output'], 'output.txt')

 

 

  • llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo", max_tokens=2000):
    • OpenAI의 gpt-3.5-turbo 모델을 사용해 언어 생성 모델 인스턴스를 초기화한다.
    • temperature=0으로 설정하여 모델의 응답을 더욱 일관성 있게 하고, max_tokens=2000으로 설정하여 생성할 응답의 최대 길이를 2000 토큰으로 제한한다.
  • tools = define_tools():
    • 이 부분에서 define_tools 함수를 호출하여 사용할 도구 목록을 가져온다.
    • 앞에서 정의된 define_tools 함수는 Google 검색 API를 도구로 등록한 목록을 반환하며, LangChain 에이전트가 검색 기능을 사용할 수 있도록 해준다.
  • prompt = create_prompt():
    • LangChain 에이전트가 사용할 프롬프트 템플릿을 생성한다.
    • create_prompt() 함수는 에이전트에게 주어진 주제를 기반으로 정보를 수집하고 응답을 생성하도록 지시하는 역할을 하는 프롬프트를 정의한다.
    • 이 프롬프트는 에이전트가 응답을 생성할 때 참조하는 기본적인 설정 역할을 한다.
  • agent = create_openai_tools_agent(llm, tools, prompt):
    • create_openai_tools_agent 함수를 호출하여 OpenAI의 LLM과 도구 목록, 그리고 프롬프트를 사용해 LangChain 에이전트를 생성한다.
    • 이 에이전트는 주어진 입력에 따라 OpenAI 모델과 등록된 도구(여기서는 Google 검색)를 활용해 답변을 생성할 수 있다.
  • agent_executor = AgentExecutor(agent=agent, tools=tools):
    • AgentExecutor 객체를 생성하여, 정의된 agent와 tools를 기반으로 작업을 실행할 준비를 한다.
    • 이 객체는 에이전트를 실행할 때 입력된 주제에 맞춰 도구를 사용하여 필요한 정보를 수집하고 응답을 생성하는 기능을 수행한다.
  • response = agent_executor.invoke({"theme": input("기사 주제를 입력해 주세요: ")}):
    • invoke 메서드를 사용하여 에이전트에게 주제를 전달하고, 이에 대한 정보를 수집한 응답을 반환받는다.
    • input("기사 주제를 입력해 주세요: ")를 통해 사용자가 기사 주제를 입력하면, 이 주제가 theme 키를 통해 invoke 메서드에 전달된다.
    • 에이전트는 주제와 관련된 정보를 수집하여 응답을 생성한다.
  • write_response_to_file(response['output'], 'output.txt'):
    • 생성된 응답을 'output.txt' 파일에 저장한다.
    • write_response_to_file 함수는 응답을 텍스트 파일로 저장하는 기능을 담당하며, response['output'] 키를 통해 응답 내용을 추출하여 저장한다.

 

7. 코드 실행 결과는 아래와 같다.

 

 

 

참고: 오기와라 유이, 후루카와 쇼이치, 최용 역, OpenAI API와 파이썬으로 나만의 챗GPT 만들기, 위키북스, 2024.