[DeepLearning] 検索とChatGPTの連動

オンプレミス-クラウド-ディープラーニング-技術のお話し

自分的にシンギュラリティを起こしたプログラム

こちらは逆瀬川さんと言うかたが起こしたプログラムに少しだけ修正を加えたもの。GoogleのCustom Search Engineを使用して、グーグル検索された結果を要約・Contextに載せて、ChatGPTの学習期間の末尾である2021年9月の情報~現在までの穴埋めをすると言うもの。実際にはBing-Searchで使われるBing-AIも同じようなことをしていると考えて良い。

これを通じて少し、AIという奴の特性が少し見えたような気がしている。また、Contextの最大長を考慮しながら文字数とか考えたりすると、どんな行列が突っ込まれてどう変換されて計算に至るのかもある程度朧気ではあるが理解につなげることが出来たなぁって感じがする。

参考にしたプログラムはこちら

参考にさせて頂いたというか、ほぼ丸コピーしたプログラムがこちらです。
ただ、いくつかうまく動かなかったところを自分なりにググって調べて修正したり、動きを把握するために処理を追補したりした箇所はあります。

対象のプログラム

# 
#Bing SearchっぽくGoogleに問い合わせながら答えを返させるような 
#ChatGPTによるQAボット # 
import sys 
import openai 
from googleapiclient.discovery import build 
from boilerpipe.extract import Extractor 
from pyknp import Juman  

google_api_key = "<Your-Google-API-Key>" 
google_cse_id = "<Your-Google-CSE-ID>" 
openai_key = "<Your-OpenAI-API-Key>" 
openai.api_key = openai_key   

def completion(new_message_text:str, settings_text:str = '', past_messages:list = []):
     if len(past_messages) == 0 and len(settings_text) != 0:
         system = {"role": "system", "content": settings_text}
         past_messages.append(system)
     new_message = {"role": "user", "content": new_message_text}
     past_messages.append(new_message)
      result = openai.ChatCompletion.create(
         model="gpt-3.5-turbo",
         messages=past_messages,
         max_tokens=512
     )
     response_message = {"role": "assistant", "content": result.choices[0].message.content}
     past_messages.append(response_message)
     response_message_text = result.choices[0].message.content
     return response_message_text, past_messages

  def get_search_results(query, num, start_index = 0):
     # Google Custom Search API
     service = build("customsearch", "v1",
                     cache_discovery=False,
                     developerKey=google_api_key)
      jumanpp = Juman()
     ana_result = jumanpp.analysis(query)
     wakati_query = "" for mrph in ana_result.mrph_list():
         if mrph.hinsi == "名詞" or mrph.hinsi == "形容詞" or mrph.hinsi == "未定義語":
             wakati_query = wakati_query + mrph.midasi + " " # CSEの検索結果を取得
     result = service.cse().list(q=wakati_query,
                                 lr="lang_ja",
                                 cx=google_cse_id,
                                 num=num,
                                 start=start_index).execute()
     # 検索結果(JSON形式)
     return result,wakati_query

  def get_links(search_result):
     links = []
     for sr in search_result['items']:
         if not('mime' in sr):
             links.append(sr['link'])
     return links

  def get_contents(links):
     contents = []
     for link in links:
         try:
             extractor = Extractor(extractor='DefaultExtractor', url=link)
         except:
             extractor = None
          if extractor != None:
             contents.append(extractor.getText())
     return contents

  def summarize_contents(contents):
     extract_texts = "" for con in contents:
         if len(con) > 500:
             # print(con[:2500])
             try:
                 m, _ = completion(f"{con[:2500]}\n\n上記の文章にかんして、{question}という質問に関連する文章を抽出してください", "", [])
		 extract_texts += m
             except:
                 print("error")

     return extract_texts[:2500]

 def search_gpt(question):
     search_result,qstring = get_search_results(question, 3)
     links = get_links(search_result)
     contents = get_contents(links)
     summary = summarize_contents(contents)
     m, _ = completion(f"{summary}\n\n上記の文章を参考に、{question}という質問に回答してください", "", [])
     m=m.replace("\n\n","")
     m=m + "\n\nGoogleに対して行ったクエリ:"+ qstring + "\n参考となった情報のURLは以下の通りです:\n"

 for li in links:
         m = m + li + "\n" return m  if len(sys.argv) != 2:
     print("何か質問文を引数に加えてね。")
 else:
     question = sys.argv[1]
     answer = search_gpt(question)
     print("あなたの質問:\n" + question + "\n")
     print("ChatGPTとGoogleSearchの答え:\n" + answer)

Tags:

Comments are closed

PAGE TOP