🐷
プロンプトはオワコン!?自分でフィードバックしまくるAlphaCodiumとは
ChatGPTにコーディングしてもらうとき、うまくいかずに何度もプロンプトを書き直していませんか?
よしなにやってくれそうな新手法の紹介です。
簡単な流れです。
1.コーディングの質問を投げる
2.LLMはそれに対して①説明②import③ソースコードを出す
3.LLMAgentを使って②と③それぞれを実行する
4.エラーが出れば3回まで再試行、出なければファイナルアンサー(古い)として出力する
図にしたものがこちら
左の方にあるLCEL Docsというのは、今回の例ではLCELの質問を投げるのでそれ用のRAGを構築しています。
この間中途半端に紹介したリフレクションエージェントのコーディング版みたいですね。
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