Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クロスワードを GPT4と量子コンピュータに解かせよう

Monta Yashi
January 28, 2024

クロスワードを GPT4と量子コンピュータに解かせよう

適当な入力に対して適当な回答を返してくれるGPT4と、厳密ではなく、程よい緩さで解を返しくれるD-Waveを用いてクロスワードを解きました。
1分くらいで英語のクロスワードが解けます。

将来はローカルのLLMと組み合わせたりしてもっと自由に解けるようになるだろうな!

Monta Yashi

January 28, 2024
Tweet

More Decks by Monta Yashi

Other Decks in Research

Transcript

  1. そうだ、クロスワードを
    GPT4&量子コンピュータ
    に解かせよう
    2024年1月28日 monta

    View full-size slide

  2. 改めてクロスワード
    どう解いてる?

    View full-size slide

  3. クロスワード
    「カギ」と呼ばれる文章によるヒントを元
    に、タテヨコに交差したマスに言葉を当て
    はめてすべての白マスを埋めるパズル。
    2 3 4 5 6
    7 8
    9
    10 11
    12
    13
    1
    タテのカギ
    ・1 外側が硬い海の生き物。
    ・2 音を聞く体の部位
      :
    ヨコのカギ
    ・1大気中の静電気により発生する自
    然現象
    ・7言葉の表す内容

    View full-size slide

  4. クロスワード
    「カギ」と呼ばれる文章によるヒントを元
    に、タテヨコに交差したマスに言葉を当て
    はめてすべての白マスを埋めるパズル。
    2 3 4 5 6
    7 8
    9
    10 11
    12
    13
    1
    タテのカギ
    ・1 外側が硬い海の生き物。
    ・2 音を聞く体の部位
      :
    ヨコのカギ
    ・1大気中の静電気により発生する自
    然現象
    ・7言葉の表す内容
    カニかな?
    カイかな?

    View full-size slide

  5. クロスワード
    「カギ」と呼ばれる文章によるヒントを元
    に、タテヨコに交差したマスに言葉を当て
    はめてすべての白マスを埋めるパズル。
    2 3 4 5 6
    7 8
    9
    10 11
    12
    13
    1
    タテのカギ
    ・1 外側が硬い海の生き物。
    ・2 音を聞く体の部位
      :
    ヨコのカギ
    ・1大気中の静電気により発生する自
    然現象
    ・7言葉の表す内容
    カニor
    カイ
    カミナリ、イナズマもあり
    だな。

    View full-size slide

  6. クロスワード
    「カギ」と呼ばれる文章によるヒントを元
    に、タテヨコに交差したマスに言葉を当て
    はめてすべての白マスを埋めるパズル。
    2 3 4 5 6
    7 8
    9
    10 11
    12
    13
    1
    タテのカギ
    ・1 外側が硬い海の生き物。
    ・2 音を聞く体の部位
      :
    ヨコのカギ
    ・1大気中の静電気により発生する自
    然現象
    ・7言葉の表す内容
    カニor
    カイ
    カミナリ
    orイナズマ
    ミミ!

    View full-size slide

  7. クロスワード
    「カギ」と呼ばれる文章によるヒントを元
    に、タテヨコに交差したマスに言葉を当て
    はめてすべての白マスを埋めるパズル。
    2 3 4 5 6
    7 8
    9
    10 11
    12
    13
    1
    タテのカギ
    ・1 外側が硬い海の生き物。
    ・2 音を聞く体の部位
      :
    ヨコのカギ
    ・1大気中の静電気により発生する自
    然現象
    ・7言葉の表す内容
    カ ミ ナ リ


    イミもあってそう

    View full-size slide

  8. クロスワード
    「カギ」と呼ばれる文章によるヒントを元
    に、タテヨコに交差したマスに言葉を当て
    はめてすべての白マスを埋めるパズル。
    2 3 4 5 6
    7 8
    9
    10 11
    12
    13
    1
    タテのカギ
    ・1 外側が硬い海の生き物。
    ・2 音を聞く体の部位
      :
    ヨコのカギ
    ・1大気中の静電気により発生する自
    然現象
    ・7言葉の表す内容
    答えの候補
    答えの候補を縦横のカギと、埋まった文字から確定していく遊び

    View full-size slide

  9. 人だけが楽しめる
    知的な
    娯楽でした

    View full-size slide

  10. そう、AIが賢く
    なるまでは

    View full-size slide

  11. 答えの候補
    ● 1.カニ、カイ
    :
    めんどくさいことはAIにやらせよう
    カギを投げて、解答の候補を生成する
    なんかイイ感
    じにする

    View full-size slide

  12. あとはイイ感じに
    組合せるだけ

    View full-size slide

  13. 組合せ?

    View full-size slide

  14. 組合せでイイ感じといえば...
    D-Wave!

    View full-size slide

  15. lexisrexの
    クロスワード
    以下の理由により、英語のクロスワードで
    チャレンジ
    ・GPT4が英語が得意
    ・日本語は自分が解けるし...
    https://www.lexisrex.com/English-Crossword-Level-3&id2=2328
    問題元:

    View full-size slide

  16. 問題をデータ化
    現時点ではここは人間。
    OpenCV使ったら出来そうだったが、今
    のところメインの興味範囲でないので保
    留。

    View full-size slide

  17. GTP4に
    なげる依頼文生成
    ヒントを含めた依頼文字列を生成します。
    枠の長さを見て単語の長さを指定しま
    す。
    GPT4、おしゃべりで余計な説明やナン
    バリングをするので、”単語だけカンマ区
    切りで返せ”と念押しします。
    ai_str = f"#Instructions \nGiven the following as clue, the word for the
    {word_len}-letter word. ¥n {add_hint_str} ¥nReply only answer words.without
    numbering.separate with comma.\n#Clues\n{hint_str[0]}"

    View full-size slide

  18. 作った依頼文
    をGPT4に丸投げ
    ほぼ、GPTのAPIサンプルのまま
    client = OpenAI()
    return_text = ""
    for i in range(max_trial):
    response = client.chat.completions.create(
    model="gpt-4",
    messages=[
    {"role":"system","content":"You are a powerful AI and
    specialize in the ability to help users solve crosswords.The user will
    give you crossword clues and you will be asked to suggest some possible
    candidate words. Please answer only the candidate words, separated by
    commas(no numbering, no explanation)."},
    {"role":"user","content":f"{request_str}"},
    ],
    temperature=1.0,
    top_p=1,
    max_tokens=256,
    frequency_penalty=0,
    presence_penalty=0
    )

    View full-size slide

  19. データを構造化
    複数回と合わせたときに同じ単語を回答
    した場合は確度が高いと判断する。
    そのための出現頻度を押さえておく。
    GPT4からの解答
    回数でdict化

    View full-size slide

  20. 定式化①
    選ばれる答えは一つだけ。
    いわゆるワンホット制約。
    for idx,row in df_puzzle_data.iterrows():
    if 'ans_candidate' not in row:
    continue
    candidates = row['ans_candidate']
    candidates_len = len(candidates)
    # if we have no candidate words , skip
    if candidates_len == 0:
    continue
    tmp_H1 = 0
    for i in range(candidates_len):
    x[(row['id'],row['axis'],i)] = Binary(f"x_{row['id']}_{row['axis']}_{i}")
    tmp_H1 += x[(row['id'],row['axis'],i)]
    H1 += Constraint((tmp_H1-1)*(tmp_H1-1), label = f"one answer for id,axis =
    ({row['id']},{row['axis']})")

    View full-size slide

  21. 定式化②
    GPT4の解答をくみあわせて、文字が交
    わる部分が
    1)異なる文字の場合、ペナルティ
    2)正解の場合、GPT4の解答頻度(確か
    らしさ)に応じてスコア
    for accross_data in ACROSS_DATA:
    # AI could not find candidate words, skip
    accross_id = accross_data['id']
    accross_candidates = list(accross_data['ans_candidate'].keys())
    accross_candidates_cnt = len(accross_candidates)
    if accross_candidates_cnt == 0:
    continue
    tmp_H2 = 0
    no_const_flag = True
    for crossing_word in accross_data['crossing_words']:
    across_loc = crossing_word[0]
    down_id = crossing_word[1]
    down_loc = crossing_word[2]
    down_data = df_down_data[df_down_data["id"] == down_id]
    down_candidates = list(down_data.iloc[0]['ans_candidate'].keys())
    down_candidates_cnt = len(down_candidates)
    if down_candidates_cnt == 0:
    continue
    #縦横の全組合せをチェック、文字が同じ場合はペナルティなし
    for i,j in product(range(accross_candidates_cnt),range(down_candidates_cnt)):
    if accross_candidates[i][across_loc-1] != down_candidates[j][down_loc-1]:
    tmp_H2 += x[(accross_id,AXIS_ACROSS,i)]*x[(down_id,AXIS_DOWN,j)]
    no_const_flag = False
    else:
    accross_key = accross_candidates[i]
    down_key = down_candidates[j]
    accross_val = accross_data['ans_candidate'][accross_key]
    down_val = down_data.iloc[0]['ans_candidate'][down_key]
    score = int(accross_val)+int(down_val)
    tmp_H2 -= x[(accross_id,AXIS_ACROSS,i)]*x[(down_id,AXIS_DOWN,j)]*score
    if no_const_flag:
    continue
    tmp_H2 = tmp_H2*(len(accross_data['crossing_words']) - 0.5)
    H2 += Constraint(tmp_H2,f"Const accross word error {accross_id}")
    H = Placeholder("OneHot")*H1 + Placeholder("WORDPENALTY")*H2

    View full-size slide

  22. 実際に実行してみる
    かなり惜しいところまで
    GPT4問い合わせ&最適化 1回目
    GPT4問い合わせ&最適化 1回目 GPT4問い合わせ&最適化 2回目
    正解
    重ね合わせが発生!
    (違います)
    解候補に正解がない。
    プロンプトの改良が必要

    View full-size slide

  23. D-Waveの解のばらつき具合も悪くない
    QPU_SAMPLING_TIME
    72.580 ms

    View full-size slide

  24. お高いんでしょ?
    高いかどうかは人によりますが、それほどでもないです。
    OpenAIのGPT費用は100円程度 D-WaveもLeapのお試し枠で十分

    View full-size slide

  25. まとめ
    D-Waveと相性の良い問題であった。
    理由1.疎結合なため、量子ビットが無駄にならない
    理由2.なんとなく正解でも答えが出るので人間に優しい
        →線形計画では工夫しないとSoftConstっぽいのができないので

    View full-size slide

  26. その他
    色んなことしたいのでお金やガジェット有り余っている方回して下さい!
    ● 予算がありあまっている方
    ● ガジェットを眠らせている方
    AR/VR、ドローン、GPU、ノートPC、タブレット、他

    View full-size slide