当前位置:AIGC资讯 > AIGC > 正文

超简单!用AWS的Bedrock对Llama进行微调

哎,微调?听起来超难的!

对吧。不过,用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吧”,这次真是亲身体会到了。

更新时间 2024-07-04