Share
Embed
クロスワードを GPT4と量子コンピュータに解かせよう
適当な入力に対して適当な回答を返してくれるGPT4と、厳密ではなく、程よい緩さで解を返しくれるD-Waveを用いてクロスワードを解きました。
1分くらいで英語のクロスワードが解けます。
将来はローカルのLLMと組み合わせたりしてもっと自由に解けるようになるだろうな!
Monta Yashi
January 28, 2024
Transcript
26 slides
-
クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7
8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位 : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 -
クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7
8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位 : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 カニかな? カイかな? -
クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7
8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位 : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 カニor カイ カミナリ、イナズマもあり だな。 -
クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7
8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位 : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 カニor カイ カミナリ orイナズマ ミミ! -
クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7
8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位 : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 カ ミ ナ リ ミ イ イミもあってそう -
クロスワード 「カギ」と呼ばれる文章によるヒントを元 に、タテヨコに交差したマスに言葉を当て はめてすべての白マスを埋めるパズル。 2 3 4 5 6 7
8 9 10 11 12 13 1 タテのカギ ・1 外側が硬い海の生き物。 ・2 音を聞く体の部位 : ヨコのカギ ・1大気中の静電気により発生する自 然現象 ・7言葉の表す内容 答えの候補 答えの候補を縦横のカギと、埋まった文字から確定していく遊び -
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]}" -
作った依頼文 を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 ) -
定式化① 選ばれる答えは一つだけ。 いわゆるワンホット制約。 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']})") -
定式化② 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 -
実際に実行してみる かなり惜しいところまで GPT4問い合わせ&最適化 1回目 GPT4問い合わせ&最適化 1回目 GPT4問い合わせ&最適化 2回目 正解 重ね合わせが発生!
(違います) 解候補に正解がない。 プロンプトの改良が必要