自分的にシンギュラリティを起こしたプログラム
こちらは逆瀬川さんと言うかたが起こしたプログラムに少しだけ修正を加えたもの。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)
Comments are closed