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. クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7

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

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

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

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

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

    8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位   : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 答えの候補 答えの候補を縦横のカギと、埋まった文字から確定していく遊び
  7. 作った依頼文 を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 )
  8. 定式化① 選ばれる答えは一つだけ。 いわゆるワンホット制約。 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']})")
  9. 定式化② 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