🐷

プロンプトはオワコン!?自分でフィードバックしまくるAlphaCodiumとは

2024/02/29に公開

ChatGPTにコーディングしてもらうとき、うまくいかずに何度もプロンプトを書き直していませんか?
よしなにやってくれそうな新手法の紹介です。

https://twitter.com/LangChainAI/status/1762884316676415550

簡単な流れです。
1.コーディングの質問を投げる
2.LLMはそれに対して①説明②import③ソースコードを出す
3.LLMAgentを使って②と③それぞれを実行する
4.エラーが出れば3回まで再試行、出なければファイナルアンサー(古い)として出力する

図にしたものがこちら

左の方にあるLCEL Docsというのは、今回の例ではLCELの質問を投げるのでそれ用のRAGを構築しています。

この間中途半端に紹介したリフレクションエージェントのコーディング版みたいですね。
https://zenn.dev/yokina_kaoto/articles/ca0a1e2aa76ddb

AlphaCodiumというコード生成のアイデアをLangGraphを使って実装したものですが、オリジナルより簡略化しているようです。

AlphaCodiumにはあった「生成したコードに自己反省させる」、「複数のソリューションを候補としてそれを評価させる」などが今回のCookbookでは存在していません。
それでもコード実行成功率が最大47%向上したとのことなので、非常にパワフルですね。

以下が実行例です。
"How can I write a RAG chain?"という質問に対しての答え
(読みやすいようにprefixは日本語訳しています)

{'prefix': 
"ここではLangChain Expression Language (LCEL)を使った
RAG (Retrieval-Augmented Generation)チェーンの書き方を紹介します。
この例では、プロンプトとLLMに検索ステップを追加し、RAGチェーンにまとめる方法を示します。
検索ステップでは、ユーザーのクエリに基づいて関連ドキュメントをフェッチし、
それらのドキュメントを使用して、より情報に基づいた応答を生成します
", 

'imports': 
from operator import itemgetter
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

'code': '# Initialize the vector store and retriever

vectorstore = FAISS.from_texts(
    ["harrison worked at kensho"], embedding=OpenAIEmbeddings())
    retriever = vectorstore.as_retriever()
# Define the prompt template
template = """
Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# Initialize the model
model = ChatOpenAI()
# Define the RAG chain
chain = (
    {"context": retriever, "question": RunnablePassthrough()}
   | prompt    | model    | StrOutputParser()
    )

    # Invoke the chain with a user query
response = chain.invoke("where did harrison work?")
print(response)'}

Discussion