这种方法是对RAG的一种新颖实现,称为RA-DIT(检索增强双指令调优),其中利用RAG数据集(查询、检索到的上下文和回答)对LLM进行了微调。反过来,通过LLM生成的数据进行了检索器微调的监督式过程。检索器训练数据可以通过监督和无监督任务生成,但是通过AI加速套件进行监督更有意义。
这种方法使得检索器在上下文中更具相关性,并与LLM保持一致。
以下代码片段展示了如何通过检索器获取每个数据点的上下文。
from llama_index import VectorStoreIndex
from llama_index.prompts import PromptTemplate
qa_prompt_tmpl_str = (
"Context information is below.\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query.\n"
"Query: {query_str}\n"
"Answer: "
)
qa_prompt_tmpl = PromptTemplate(qa_prompt_tmpl_str)
vector_retriever = vector_index.as_retriever(similarity_top_k=1)
在这里,是关于用于OpenAI的微调端点的训练数据的格式化。
def save_openai_data(dataset, out_path):
# out_fp = open("data_rag/qa_pairs_openai.jsonl", "w")
out_fp = open(out_path, "w")
# TODO: try with different system prompts
system_prompt = {
"role": "system",
"content": "You are a helpful assistant helping to answer questions about the Llama 2 paper.",
}
train_qr_pairs = dataset.qr_pairs
for line in train_qr_pairs:
query, response = line
user_prompt = {"role": "user", "content": query}
assistant_prompt = {"role": "assistant", "content": response}
out_dict = {
"messages": [system_prompt, user_prompt, assistant_prompt],
}
out_fp.write(json.dumps(out_dict) + "\n")
save_openai_data(train_dataset, "data_rag/qa_pairs_openai.jsonl")
使用RAG对Fine-tuning进行微调,将RAG输出作为LLM微调的训练数据。而微调将使LLM在使用案例上更好地解释上下文。
人机交互方法允许采用监督方法,在该方法中可以策划响应,然后检索器根据此反馈进行训练。
通过人工筛选的检索器辅助语言模型(RALMs)通过处理人际互动的长尾和外部数据存储的最新知识来提高性能。
1. LLM被更新以改进检索信息的使用。
2. 而检索器则会根据相应的使用案例示例进行更新。
这种方法可以改善知识利用和增强上下文意识。
总结
1. Fine-Tuning和RAG不是互斥的,同时使用两者是理想的。特别是考虑到OpenAI在Fine-Tuning方面所引入的简化方法。
2. RA-DIT(检索辅助双指令调整)在Fine-Tuning和RAG之间建立了一种共生关系,其中RAG数据用于Fine-Tuning,而检索器则使用用户数据进行更新。
3. 通过筛选数据进行检索器训练的人工监督过程需要一个AI加速的潜在空间,或者正如HumanFirst所称的自然语言数据生产力套件。
4. 这种双指令调整方法实现了一个有监督的持续改进循环,并解决了用户对话的长尾问题。
上面的图展示了RA-DIT方法,它分别对LLM和检索器进行微调。对于给定的示例,LM-ft组件更新LLM以最大化给定正确答案的可能性。R-ft组件更新检索器,以最小化检索器得分分布与LLM偏好之间的KL散度。