Skip to content

最佳实践

zR edited this page Oct 7, 2023 · 20 revisions

使用自定义的分词器

  1. text_splitter文件夹下新建一个文件,文件名为您的分词器名字,比如my_splitter.py,然后在__init__.py中导入您的分词器,如下所示:
from .my_splitter import MySplitter
  1. 修改config/model_config.py文件,将您的分词器名字添加到text_splitter_dict中,如下所示:
MySplitter: {
        "source": "huggingface",  # 选择tiktoken则使用openai的方法
        "tokenizer_name_or_path": "your tokenizer", #如果选择huggingface则使用huggingface的方法,部分tokenizer需要从Huggingface下载
    }
TEXT_SPLITTER = "MySplitter"

完成上述步骤后,就能使用自己的分词器了。

使用自定义的 Agent 工具

  1. 创建自己的Agent工具
  • 开发者在server/agent文件中创建一个自己的文件,并将其添加到tools.py中。这样就完成了Tools的设定。

  • 当您创建了一个custom_agent.py文件,其中包含一个work函数,那么您需要在tools.py中添加如下代码:

from custom_agent import work
Tool.from_function(
    func=work,
    name="该函数的名字",
    description=""
    )
  • 请注意,如果你确定在某一个工程中不会使用到某个工具,可以将其从Tools中移除,降低模型分类错误导致使用错误工具的风险。
  1. 修改 custom_template.py 文件

开发者需要根据自己选择的大模型设定适合该模型的Agent Prompt和自自定义返回格式。 在我们的代码中,提供了默认的两种方式,一种是适配于 GPTQwen 的提示词(通常来说,这两个模型能实现Agent能力,GPT4效果较好,Qwen勉强入门)

"""
    Answer the following questions as best you can. You have access to the following tools:
    
    {tools}
    Use the following format:
    
    Question: the input question you must answer
    Thought: you should always think about what to do
    Action: the action to take, should be one of [{tool_names}]
    Action Input: the input to the action
    Observation: the result of the action
    ... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
    Thought: I now know the final answer
    Final Answer: the final answer to the original input question
    
    Begin!
    
    history:
    {history}
    
    Question: {input}
    Thought: {agent_scratchpad}
"""

另一种是适配于 GLM API PRO 的提示词(通常来说,这个模型基本无法跑起来)

"""
尽可能地回答以下问题。你可以使用以下工具:{tools}
请按照以下格式进行:
Question: 需要你回答的输入问题
Thought: 你应该总是思考该做什么
Action: 需要使用的工具,应该是[{tool_names}]中的一个
Action Input: 传入工具的内容
Observation: 行动的结果
       ... (这个Thought/Action/Action Input/Observation可以重复N次)
Thought: 我现在知道最后的答案
Final Answer: 对原始输入问题的最终答案

现在开始!

之前的对话:
{history}

New question: {input}
Thought: {agent_scratchpad}
"""

开发者可以自行对提示词进行修改。

  1. 局限性
  • 在我们的实验中,小于70B级别的模型,若不经过微调,很难达到较好的效果。因此,我们建议开发者使用大于70B级别的模型进行微调,以达到更好的效果。即使使用了大于70B级别的模型,开发者也应该在Prompt上进行深度优化,以让模型能成功的选择工具并完成任务。
  • 在我们的实验中,GPT4能够稳定的发挥出Agent能力,Qwen具有基础的Agent能力。Qwen系列模型已经对 Agent 进行了对齐,但是经过开发组调试,其效果尚且不能完成大规模的Agent任务。我们不推荐 开发者花费无用的时间在尝试未经过微调的其他模型。
  • 由于React Agent 的脆弱性,temperature 参数的设置对于模型的效果有很大的影响。我们建议开发者在使用自定义Agent时,对于不同的模型,将其设置成0.1以下,以达到更好的效果。

使用自定义的微调模型

  • 本项目基于 FastChat 加载 LLM 服务,故需以 FastChat 加载 PEFT 路径。
  • 开发者需要保证路径名称里必须有 peft 这个词。
  • 配置文件的名字为 adapter_config.json
  • peft 路径下包含.bin 格式的 PEFT 权重, peft路径在startup.py中 create_model_worker_app 函数的 args.model_names 中指定
    args.model_names = ["/home/ubuntu/your_peft_folder/peft"]
  • 执行代码之,应该设定环境变量
PEFT_SHARE_BASE_WEIGHTS=true 

注:如果上述方式启动失败,则需要以标准的 FastChat 服务启动方式分步启动,PEFT加载详细步骤参考以下ISSUE

加载lora微调后模型失效

使用自定义的嵌入模型

  • 使用自定义的嵌入模型,开发者需要将其合并到原始的嵌入模型中,之后仅需将其路径添加到config/model_config.py中并选择自己的模型启动即可。

日志功能

  • 日志功能记录了大模型的心跳和网络端口传输记录,开发者可以通过日志功能查看模型的运行情况。

推荐的模型组合

  • 在默认的配置文件中,我们提供了以下模型组合
LLM: Chatglm2-6b
Embedding Models: m3e-base
TextSplitter: ChineseRecursiveTextSplitter
Kb_dataset: faiss
  • 我们推荐开发者根据自己的业务需求进行模型微调,如果不需要微调,且配置充足,可以选择以下性能较好的本地大模型配置:
model_config.py
LLM: Qwen-14B-Chat 或 Baichuan2-13B-Chat
Embedding Models: piccolo-large-zh 或 bge-large-zh-v1.5 
HISTORY_LEN = 20
TEMPERATURE = 0.1

使用该模型将需要更高的硬件要求

1张 RTX A6000 或者 A40 等 48GB 显存以上的显卡。推荐 1 x A100 以上。
(使用多张显卡拼接也能运行,但是速度非常慢,2张4090拼接运行大概为一秒一个字的速度)

64GB 内存用于加载模型而不被Kill

服务器级的CPU,推荐 Xeon(R) Platinum 8358P 以上
  • 如果开发者知识库较大,有大量文档,大文件,我们推荐开发者使用 pg 向量数据库

  • 如果开发者的知识库具有一定的关键词特征,例如:

    • 问答对文件(以Q + A 为一个组合的json文件)
    • Markdown文件
    • 并排的pdf文件
    • 具有多个表格的pdf文件

    我们推荐开发者自行开发分词器,以达到更好的效果。

  • 如果开发者想使用更全面的 Agent 功能,我们推荐开发者使用以下配置

LLM: Qwen-14B-Chat 或 GPT-4
Tools 的工具控制在10个之内

实际使用效果

在这里,我们放置了一些成功调用的效果图,方便开发者进行查看自己是否成功运行了框架。

检查是否成功上传/管理自己的知识库

在WebUI界面上传知识库,则必须保证知识库进行向量化,成功之后,文件会被切分并在向量位置打钩。 下图展示了成功上传知识库的画面

成功上传知识库

请确保所有知识库都已经进行了向量化。

检查是否成功开启LLM对话

若打开webui后,在该模式下能成功跟大模型对话即成功调用。

下图为成功调用LLM的效果图:

LLM对话

检查是否成功调用知识库/搜索

若成功调用知识库,则你应该能看到,在大模型回答的下方有一个知识库匹配结果的展开框,并且内部显示了相关的匹配结果。 如果没有搜索到相关内容,则会提示根据已知信息无法回答问题,并且下拉框中没有任何内容。

下图为成功调用知识库效果图:

成功调用知识库

在这个案例中,第一次用户的提问无法在知识库中寻找到合适的答案,因此,大模型回答了根据已知信息无法回答问题

第二次用户的提问能在知识库中寻找到合适的答案,因此,大模型给出了一个正确的回答。

注意: 知识库的搜索情况取决于嵌入模型的准度,分词器的设置,知识库的排版和大模型的数量,提示词设定等多个因素。因此,需要开发者进行深度的优化和调试。

检查是否成功调用Agent工具

若成功调用Agent工具,则你应该看到大模型完整的思维过程,这会在思考过程下拉框中显示出来。如果成功调用Agent工具,则你应该看到Markdown引用效果的工具使用情况。 在Agent对话模式中,思考过程中显示的是大模型的思考过程,而下拉框之前的内容为大模型的Final Answer,缺乏中间的运算过程。

下图展现了一个成功调用Agent工具的效果图:

成功调用单个Agent工具

本框架支持模型连续掉用多个Agent工具,下图展示了一个一个提问中大模型连续调用多个Agent工具的效果图:

连续调用多个Agent工具

在这个案例中,3900是大模型的最终答案,其余都是思考过程。

Clone this wiki locally