본문 바로가기
개발/LLM

QA using a search API

by ▶ Carpe diem ◀ 2023. 9. 24.

QA using a search API

이번 블로그에서는 NewsAPI를 이용하여 뉴스를 찾는 어플리케이션에 대해 정리해보고자 합니다. 한국어로 뉴스를 검색할 수 있는 search api 는 찾지 못 하여 NewsAPI 를 이용하여 뉴스 검색하는 예제를 작성해보았습니다.

https://questionanswering.streamlit.app/

 

app

This app was built in Streamlit! Check it out and visit https://streamlit.io for more awesome community apps. 🎈

questionanswering.streamlit.app

 

기본적인 데이터의 흐름은 다음과 같습니다.

QA 서비스 데이터 흐름도
QA 서비스 데이터 흐름도

 

  1. Client가 QA service를 통해 검색하고자 하는 질문을 입력합니다.
    이 예제에서는 "최근 10일동안 환경 오염 뉴스는 머가 있어?" 문장으로 검색을 합니다.
  2. NewsAPI 검색을 위해 Bard에게 사용자 입력값 변경을 요청합니다.
  3. Bard는 변경된 사용자 입력값을 QA 서비스로 전달합니다.
  4. Bard에 의해 생성된 검색어를 이용하여 NewsAPI에서 관련 뉴스를 검색합니다.
  5. 검색된 내용을 QA 서비스로 전달합니다.
  6. 사용자에게 검색된 내용을 보여줍니다.

위 데이터 흐름에 맞춰 하나씩 알아보기 전에 Streamlit을 이용해서 어플리케이션 작성하는 것은 이전 블로그 내용을 참고하세요.

2023.09.10 - [분류 전체보기] - Streamlit을 이용한 Chatbot 만들기

 

Streamlit을 이용한 Chatbot 만들기

Streamlit을 이용한 Chatbot 만들기 Streamlit을 이용해서 Chatbot을 만들기 전에 Streamlit이 무엇인지 간단히 알아보고, streamlit-chat 패키지를 이용하여 간단한 Chatbot을 만들어보자. streamlit 이란? Streamlit은 P

wide-shallow.tistory.com

 

사용자 질문을 NewsAPI 검색을 위한 Query로 변경하기

이 내용은 "QA 서비스 데이터 흐름도"에서 2, 3번에 해당하는 내용입니다.

 

"최근 10일 동안 환경 오염 관련 뉴스는 어떤 것이 있니?" 를 사용자가 NewsAPI를 이용해서 검색하기 위해 위에서 설명한 request parameters 중 q, from, to에 해당하는 정보를 추출해야 합니다. q는 환경 오염 관련 뉴스로 토양 오염, 대기 오염 등 환경에 관련된 단어들로 이루어진 키워드들을 생각해볼 수 있습니다. from, to는 검색하는 날(2023.09.24) 기준으로 from은 2023-09-15, to는 2023-09-24가 될 것입니다. 사용자가 입력한 문장으로부터 q, from, to를 생성, 추출하기 위해 Bard를 이용하였습니다.

prompt = '\
Forget any previous instructions.\
\
1. If the given text is not in English, translate it to English.\
\
2. Leave only the main keywords from the translated content. You have to remove date information in the main keywords. Generates an array of search terms related to the main keywords. Search as generally as possible and use a variety of relevant keywords. Include as many search terms as you can think of, including or excluding them. {\"search_terms\" : [\"keyword1\", \"keyword2\", \"keyword2 keyword1\"]}\
\
3. Change the date information in the given text to the yyyy-mm-dd format and represent it as {\"date\" : [\"from_dat\", \"to_date\"]}. If it is not expressed as a time period, to_date should be today.\
{\"search_terms\" : [\"keyword1\", \"keyword2\", \"keyword2 keyword1\"], \"date\" : [\"from_date\", \"to_date\"]}\
let\'s think step by step.\
\
' + user_input

 

위에 작성된 prompt를 순서대로 알아보면 다음과 같습니다.

  • 한글로 작성된 뉴스는 NewsAPI를 통해 검색이 잘 안 되어 입력된 문장을 먼저 영어로 번역하였습니다.
  • 번역된 내용에서 날짜 정보를 제외한 주요 키워드를 추출하고, 유사한 단어들을 이용하여 NewsAPI에 검색 키워드를 보강하도록 하였습니다.
  • 제외한 날짜 정보는 뉴스를 검색할 때 from, to로 전달해주어야 하기 때문에 yyyy-mm-dd 포맷으로 알려달라고 요청하였습니다.
  • 마지막으로 Zero-shot CoT prompting을 위해 "Let's think step by step"을 추가하였습니다.

각 단계에 대해 Bard에서 응답을 주는 것을 살펴보면 다음과 같습니다.

Step 1: Translate the given text to English.
**Original text:** 최근 10일동안 환경 오염 뉴스는 머가 있어?
**English translation:** What is the environmental pollution news in the past 10 days?

Step 2: Leave only the main keywords from the translated content and remove date information.
**Main keywords:** environmental pollution, news, past 10 days

Step 3: Generate an array of search terms related to the main keywords. Search as generally as possible and use a variety of relevant keywords, including or excluding them.
**Search terms:**
* environmental pollution
* air pollution
* water pollution
* soil pollution
* climate change
* environmental news
* environmental impact
* environmental protection
* environmental awareness
* sustainability
* green living

Step 4: Change the date information in the given text to the yyyy-mm-dd format and represent it as {"date" : ["from_date", "to_date"]}.
**Date:** 2023-09-15 to 2023-09-24

Step 5: Combine the search terms and date information into a single JSON object.
```json
{
  "search_terms": ["environmental pollution", "air pollution", "water pollution", "soil pollution", "climate change", "environmental news", "environmental impact", "environmental protection", "environmental awareness", "sustainability", "green living"],
  "date": ["2023-09-15", "2023-09-24"]
}
```

내가 요청했던 단계보다 더 자세하게 나누어 응답을 생성하는 것을 확인할 수 있습니다. 또한 Step 2단계에서 날짜 정보를 가지고 있는 past 10 days가 주요 키워드로 추출되었지만, Step 3단계에서 날짜 정보를 제외한 단어를 이용하여 search terms를 생성하는 것을 확인할 수 있습니다.

 

Zero-shot CoT prompting은 아래 블로그를 참고하세요.

2023.09.20 - [분류 전체보기] - Chain of Thought Prompting

 

Chain of Thought Prompting

Prompt Engineering Guide(https://www.promptingguide.ai/) 내용을 참고해서 작성하거나, 번역한 내용입니다. Chain of Thought Prompting (생각의 사슬 프롬프팅) LLM 에게 이유에 대해 설명하도록 만드는 방법입니다.

wide-shallow.tistory.com

 

NewsAPI

이 내용은 "QA 서비스 데이터 흐름도"에서 4, 5번에 해당하는 내용입니다.

 

https://newsapi.org/는 전 세계의 뉴스 기사를 제공하는 API 서비스로 뉴스 기사의 제목, 본문, 링크, 날짜, 출처 등 다양한 정보를 제공하며, JSON 또는 XML 형식으로 데이터를 반환합니다.

 

API key를 받아야 NewsAPI를 이용할 수 있습니다. API key를 받기 위해서는 NewsAPI 웹 사이트에 접속해서 "Get API Key" 를 클릭하면 이메일 정보 입력 등을 통해 무료 계정 API key를 간단하게 발급받을 수 있습니다.

NewsAPI 홈페이지
NewsAPI 홈페이지

 

무료 계정과 유료 계정은 아래와 같은 차이가 있습니다. 간단하게 테스트 해보고 위해 무료 계정을 발급 받았고, 요청 제한으로 인해 예제 코드를 작성할 때 요청을 최소한으로 하게 합니다.

무료 계정 유료 계정
- 하루에 100개의 요청 제한
- JSON 또는 XML 형식의 데이터 제공
- 전 세계의 뉴스 기사 제공
- 요청 수 제한 없음
- JSON, XML, CSV, HTML 형식의 데이터 제공
- 검색 조건, 출처, 언어 등 다양한 필터링 기능 제공
- 뉴스 기사의 제목, 본문, 링크, 날짜, 출처 등 다양한 정보 제공

 

NewsAPI의 endpoint는 NewsAPI Documentation을 참고하시면 자세히 확인할 수 있고, 여기에서는 예제 코드에서 사용하는 endpoint에 대해 알아보겠습니다.

 

Endpoint

API와 endpoint 관계
API와 endpoint 관계

 

예제코드에서 everything endpoint를 사용(문서 검색 및 분석을 할때 사용)합니다. Request parameter q, apiKey, pageSize, sortBy, from, to를 사용하여 검색을 합니다.

  • apiKey: 위에서 발급받은 api key
  • q: 글 제목과 본문에서 검색할 키워드 또는 구문
  • pageSize: 페이지당 반환할 결과의 수
  • sortBy: 글을 정렬할 순서 (relevancy, popularity, publishedAt)
  • from: 검색하고자 하는 기간의 가장 오래된 날짜와 시간(ISO 8601 형식).
  • to: 검색하고자 하는 기간의 가장 최근 날짜와 시간(ISO 8601 형식).

위의 endpoint와 request parameters를 사용하여 작성한 코드는 아래와 같습니다.

def search_news(
        query: str,
        news_api_key: str = st.session_state.news_api_key,
        num_articles: int = 10,
        from_datetime: str = "2023-09-01",
        to_datetime: str = "2023-09-15",
) -> dict:
    response = requests.get(
        "https://newsapi.org/v2/everything",
        params={
            "q": query,
            "apiKey": news_api_key,
            "pageSize": num_articles,
            "sortBy": "relevancy",
            "from": from_datetime,
            "to": to_datetime,
        },
    )
    return response.json()

 

실행 화면

실행 화면
실행 화면

 

이번 블로그에서는 zero-shot CoT prompting을 이용하는 방법과 search API 연동하는 방법에 대해 알아보았습니다. NewsAPI를 통해 검색된 내용들을 Bard를 통해 요약까지 하여 사용자에게 알려주면 좋겠지만, NewsAPI를 통해 검색된 기사들의 전체 내용을 알기 어려워 요약하는 부분은 제외하였습니다.

'개발 > LLM' 카테고리의 다른 글

ControlNet 이란?  (2) 2023.10.04
Diffusion 모델 종류 및 예제  (0) 2023.10.02
Retrieval Augmented Generation(RAG)  (0) 2023.09.23
Chain of Thought Prompting  (0) 2023.09.20
Zero-Shot(제로샷)/Few-Shot(퓨샷) Prompting  (0) 2023.09.18