哎,微调?听起来超难的!
对吧。不过,用Amazon Bedrock的话,其实挺简单的。
Customize models in Amazon Bedrock with your own data using fine-tuning and continued pre-training | AWS News Blog
准备的东西
从最新的AWS博客中挑选了三篇关于Bedrock的文章
Build RAG applications with MongoDB Atlas, now available in Knowledge Bases for Amazon Bedrock | AWS News Blog
Amazon Titan Text Embeddings V2 now available in Amazon Bedrock, optimized for improving RAG | AWS News Blog
Run scalable, enterprise-grade generative AI workloads with Cohere Command R & R+, now available in Amazon Bedrock | AWS News Blog
Bedrock的微调方法
数据集的格式
Prepare the datasets - Amazon Bedrock
配额上限值
Quotas for Amazon Bedrock - Amazon Bedrock
开始微调!
创建训练数据
将上述的Bedrock手册和学习目标的博客文章作为PDF或图片上传到Claude中,并将其转换为可直接用于训练的JSONL格式。
将其以JSONL格式上传到S3
在Bedrock中创建微调任务
只需在管理控制台中点击几下即可完成。这次我们选择了Llama 2 70B作为源模型
接下来只需等待任务完成,大约不到一个小时。
训练完成后,定制模型即可使用。不过,要使用它需要购买预留吞吐量!(至少需要支付1小时的费用,大约23.5美元)。
购买预留吞吐量后,也可以从playground中使用它!
准备比较对象(RAG)
将相同的三篇博客PDF文件上传到S3,并创建知识库。
从Llama 2调用知识库的代码:
import streamlit as st
import boto3
import json
def main():
"""主函数在Streamlit应用中处理聊天交互。
此函数初始化聊天界面,处理用户输入,并显示AI模型的响应。
"""
# 如果会话状态中没有聊天消息,则进行初始化
if "messages" not in st.session_state:
st.session_state.messages = []
# 显示现有的聊天消息
if st.session_state.messages:
for info in st.session_state.messages:
with st.chat_message(info["role"]):
st.write(info["content"])
# 处理新的用户输入
if prompt := st.chat_input(""):
# 将用户消息添加到会话状态
st.session_state.messages.append({"role": "Human", "content": prompt})
# 显示用户消息
with st.chat_message("Human"):
st.write(prompt)
# 准备并显示AI的响应
with st.chat_message("Assistant"):
message_placeholder = st.empty() # 用于动态更新的占位符
with st.spinner("搜索中..."):
response = invoke_model(prompt)
full_response = "" # 初始化变量以累积响应
if stream := response.get("body"):
for event in stream:
if chunk := event.get("chunk"):
# 解码并处理每个响应块
full_response += json.loads(chunk.get("bytes").decode("utf-8"))[
"generation"
]
# 用部分响应更新占位符
message_placeholder.markdown(full_response + "▌")
# 最终显示完整响应
message_placeholder.write(full_response)
# 将AI的响应添加到会话状态
st.session_state.messages.append(
{"role": "Assistant", "content": full_response}
)
def invoke_model(prompt):
"""调用AI模型,生成基于用户提示和现有对话上下文的响应。
参数:
prompt: 用户的输入提示。
message_placeholder: 用于动态显示AI响应的Streamlit占位符。
返回值:
AI模型生成的响应。
"""
# 初始化用于Bedrock运行时的AWS Boto3客户端
retrieve_bedrock = boto3.client(
service_name="bedrock-agent-runtime", region_name="us-east-1"
)
bedrock = boto3.client(service_name="bedrock-runtime", region_name="us-east-1")
# 从知识库中获取信息
docs_info = retrieve_bedrock.retrieve(
knowledgeBaseId="XXXXXXXXXX", # 知识库ID
retrievalQuery={"text": prompt},
)
# 编译用于模型提示的消息
messages = [
f'{message["role"]}:{message["content"]}'
for message in st.session_state.messages
]
# 格式化用于模型调用的主体
body = json.dumps(
{
"prompt": "\n\n".join(messages)
+ "\n\n"
+ "info:"
+ json.dumps(docs_info["retrievalResults"])
+ "Assistant:",
# "max_tokens_to_sample": 1000,
}
)
# 调用模型并处理响应流
response = bedrock.invoke_model_with_response_stream(
modelId="meta.llama2-70b-chat-v1", body=body
)
return response
if __name__ == "__main__":
main()
那么,现在来评估一下。微调 vs RAG!
由于Llama 2不是中文母语模型,我们使用英语进行对话,并将结果翻译如下。
问题① 在AWS的Bedrock中可用的向量数据库是什么?
[INST] Answer me in around 100 words. [/INST]
Human: Tell me vector stores available in Knowledge Bases for Amazon Bedrock.
Assistant:
回答(微调版 Llama 2):
我在网上找到了这个信息。Amazon Bedrock 是一个向量存储库,为客户提供各种服务。这些服务包括在线购物、客户服务和商品配送等。
回答(RAG版 Llama 2):
作为Bedrock向量存储库,可用的选项包括Titan Embeddings G1(处理文本)、Cohere Embed(生成1024维向量)、Pinecone(使用Annoy)、Redis(使用Redis)和MongoDB Atlas(使用向量搜索)。Titan Embeddings G1可以处理文本,Cohere Embed可以生成1024维向量,Pinecone使用Annoy算法,Redis使用Redis,而MongoDB Atlas则使用向量搜索。使用这些向量数据库,能够在Amazon Bedrock中实现快速搜索和优质推荐。
问题② Titan Text Embeddings V2的优点是什么?
[INST] Answer me in around 100 words. [/INST]
Human: Tell me benefits of Titan Text Embeddings V2.
Assistant:
回答(微调版 Llama 2):
Titan Text Embeddings V2 是 Titan 文本嵌入模型的新版本,其性能得到了提升和优化。Titan Text Embeddings V2 的优点包括:
1. **精度提升**:Titan Text Embeddings V2 在更大规模和更多样化的数据集上进行了训练,在各种自然语言处理任务中的精度和性能得到了提升。
2. **推理速度加快**:Titan Text Embeddings V2 优化了文本数据的处理,使其能够更快速、高效地进行推理。
3. **更高效的模型架构**:Titan Text Embeddings V2 采用了更高效的模型架构,能够以更少的资源更高效地处理文本数据。
4. **更好的多语言支持**:由于在多语言数据集上进行了训练,Titan Text Embeddings V2 能够更好地处理多种语言的文本。
5. **更好的长文本支持**:Titan Text Embeddings V2 在较长文本序列上进行了训练,因此在处理长文档时,能够更好地捕捉上下文。
总的来说,Titan Text Embeddings V2 是 Titan 文本嵌入模型的一个更高级、更改进的版本,提供了更好的性能、更快的推理速度、多语言和长文本的更好支持。
回答(RAG版 Llama 2)
Titan Text Embeddings V2 的优点如下:
1. **更高的精度和搜索性能**:在较小维度下实现高精度和出色的搜索性能,减少了存储需求和等待时间。
2. **优化用于搜索扩展生成(RAG)**。
3. **支持100多种语言的预训练**。
4. **精确创建文本的详细摘要**:能够快速掌握每个文档的重要点,就像一个出色的助手。
5. **改进的信息检索**:使RAG能够为LLM(大型语言模型)获取最相关的信息,从而提供更准确和相关的回答。
6. **全托管API**:可以通过Amazon Bedrock使用。
7. **强大多用途**:由广泛数据集训练的Amazon Titan模型功能强大且多用途,同时遵守负责任的AI实践,适用于多种应用。
8. **可选择的输出向量尺寸**:输出向量尺寸(256、512或1024)可选。较大的向量尺寸可生成更详细的响应,但计算时间也会更长;较短的向量尺寸则响应时间更快但细节较少。
希望这些信息对您有所帮助!如有其他问题,请随时告知。
问题③ Command R具体在哪些方面针对RAG进行了优化?
[INST] Answer me in around 100 words. [/INST]
Human: Tell me how Command R is specialized for RAG.
Assistant:
回答(微调版 Llama 2):
Command R 是专门为 RAG(Retrieval-Augmented Generation)设计的命令,用于在 RAG 环境中执行特定任务。它提供了一个全面的工具集,可以与其他命令结合使用,以优化在 RAG 环境中的工作。通过这种设计,Command R 能够有效地支持和增强 RAG 的各项功能。
回答(RAG版 Llama 2)
Command R 是一个专门为 RAG(检索增强生成)设计的可扩展多语言生成模型。它配备了一个能够比其他模型更大幅度压缩非英语文本的分词器,非常适合企业级工作负载。Command R+ 是一个最先进的 RAG 优化模型,能够提供可靠且可验证的响应,并包含内联引用,非常适合企业应用。这两个模型都可以通过 Amazon Bedrock 使用,用户可以通过 AWS 命令行界面 (CLI) 和 AWS 软件开发工具包 (SDK) 进行访问。
评估结果
微调版几乎全是幻觉,感觉不到学习效果。用大约100条数据的训练集,很难通过微调显著提升模型的性能。
经常听到“微调是最后的手段!先考虑RAG吧”,这次真是亲身体会到了。