Skip to content

openai_api_zh

ymcui edited this page May 10, 2024 · 5 revisions

仿OpenAI API

这是一个使用fastapi实现的简易的仿OpenAI API风格的服务器Demo示例。以下展示了使用Llama-3-Chinese-Instruct加载的示例。

Colab部署示例:https://colab.research.google.com/drive/1mbHo-kAL_zP-JX8TIdLcYYidpTryw6KP?usp=sharing

部署方式

安装依赖

pip install fastapi uvicorn shortuuid sse_starlette peft bitsandbytes

启动命令

python scripts/oai_api_demo/openai_api_server.py \
--base_model /path/to/base_model \
--lora_model /path/to/lora_model \
--gpus 0,1 \
--use_flash_attention_2

参数说明:

  • --base_model {base_model}:存放HF格式的Llama-3-Chinese-Instruct模型权重和配置文件的目录,可以是合并后的模型(此时无需提供--lora_model),也可以是转后HF格式后的原版Llama-3-Instruct模型(需要提供--lora_model

  • --lora_model {lora_model}:Llama-3-Chinese-Instruct的LoRA解压后文件所在目录,也可使用🤗Model Hub模型调用名称。若不提供此参数,则只加载--base_model指定的模型

  • --tokenizer_path {tokenizer_path}:存放对应tokenizer的目录。若不提供此参数,则其默认值与--lora_model相同;若也未提供--lora_model参数,则其默认值与--base_model相同

  • --only_cpu:仅使用CPU进行推理

  • --gpus {gpu_ids}:指定使用的GPU设备编号,默认为0。如使用多张GPU,以逗号分隔,如0,1,2

  • --load_in_8bit:使用8bit模型进行推理,可节省显存,但可能影响模型效果

  • --load_in_4bit:使用4bit模型进行推理,可节省显存,但可能影响模型效果

  • --use_flash_attention_2:使用flash-attention2加速推理。

文字接龙(completion)

最基础的API接口,输入prompt,输出语言大模型的文字接龙(completion)结果。API DEMO内置有prompt模板,prompt将被套入instruction模板中,这里输入的prompt应更像指令而非对话。

快速体验completion接口

请求command:

curl http://localhost:19327/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "请你介绍一下中国的首都"
  }'

json返回体:

{
  "id": "cmpl-XyN3HwTjKFbNLS88J79C5D",
  "object": "text_completion",
  "created": 1711419745,
  "model": "llama-3-chinese",
  "choices": [
    {
      "index": 0,
      "text": "中国的首都是北京,位于华北平原上,是中国最大的城市之一。北京有着悠久的历史和文化底迹,被誉为\"万里长城起点、紫禁城居中\"。\n\n北京作为中国的政治、经济、文化中心,拥有丰富的旅游资源和名胜古迹。其中最著名的景点包括故宫、天安门广场、颐和园、圆明园等。此外,北京还有许多博物馆、艺术馆和剧院,如中国国家博物馆、中国美术馆、国家大剧院等,展示了中国的历史和文化。\n\n北京也是中国的政治中心,是中央人民政府所在地。国务院、全国人大常委会、全国政协常委会等重要机构均设立在北京。此外,北京还是中国的外交中心,许多国际组织和外国使领馆设在这里。\n\n北京的交通非常便利,有四个机场、六条地铁线路以及高速公路网络。北京还是中国的科技创新中心之一,拥有众多高校和研究机构,如清华大学、北京大学等。\n\n总体来说,北京作为中国的首都,具有深厚的历史和文化底蕴,同时也是一个现代化、繁荣发展的城市,吸引着众多国内外游客前来参观和探索。"
    }
  ]
}

completion接口参数说明

有关Decoding策略,更加详细的细节可以参考 https://towardsdatascience.com/the-three-decoding-methods-for-nlp-23ca59cb1e9d 该文章详细讲述了三种LLaMA会用到的Decoding策略:Greedy Decoding、Random Sampling 和 Beam Search,Decoding策略是top_k、top_p、temperature、num_beam等高级参数的基础。

  • prompt: 生成文字接龙(completion)的提示。

  • max_tokens: 新生成的句子的token长度。

  • temperature: 在0和2之间选择的采样温度。较高的值如0.8会使输出更加随机,而较低的值如0.2则会使其输出更具有确定性。temperature越高,使用随机采样最为decoding的概率越大。

  • num_beams: 当搜索策略为束搜索(beam search)时,该参数为在束搜索(beam search)中所使用的束个数,当num_beams=1时,实际上就是贪心搜索(greedy decoding)。

  • top_k: 在随机采样(random sampling)时,前top_k高概率的token将作为候选token被随机采样。

  • top_p: 在随机采样(random sampling)时,累积概率超过top_p的token将作为候选token被随机采样,越低随机性越大,举个例子,当top_p设定为0.6时,概率前5的token概率分别为{0.23, 0.20, 0.18, 0.11, 0.10}时,前三个token的累积概率为0.61,那么第4个token将被过滤掉,只有前三的token将作为候选token被随机采样。

  • repetition_penalty: 重复惩罚,具体细节可以参考这篇文章:https://arxiv.org/pdf/1909.05858.pdf

  • do_sample: 启用随机采样策略。默认为true。

聊天(chat completion)

聊天接口支持多轮对话。

快速体验聊天接口

请求command:

curl http://localhost:19327/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user","content": "如何制作个人网站?"}
    ],
    "repetition_penalty": 1.0
  }'

json返回体:

{
  "id": "chatcmpl-tM9d3ECpZMRojTBgYx53ej",
  "object": "chat.completion",
  "created": 1711420136,
  "model": "llama-3-chinese",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "user",
        "content": "如何制作个人网站?"
      }
    },
    {
      "index": 1,
      "message": {
        "role": "assistant",
        "content": "制作个人网站可以通过以下步骤进行:\n\n1. 确定网站目的和内容:首先需要明确个人网站的目的和内容,例如是展示个人作品、分享个人经历、提供个人服务等。\n\n2. 选择合适的网站平台:根据个人需求和技术水平,选择合适的网站平台。常见的平台有WordPress、Wix、Squarespace等。\n\n3. 注册域名和购买主机:选择一个合适的域名,并购买一个主机来存储网站文件和数据。\n\n4. 安装和设置网站平台:根据所选择的平台,按照平台的指导进行安装和设置。\n\n5. 设计网站布局和样式:根据个人喜好和网站目的,设计网站的布局和样式。可以使用模板或自定义设计。\n\n6. 创建网站内容:根据网站目的,创建网站的内容,包括文字、图片、视频等。\n\n7. 添加功能和插件:根据需求,添加网站的功能和插件,例如联系方式、社交媒体分享等。\n\n8. 优化网站SEO:进行网站的SEO优化,包括关键词优化、网站结构优化等,以提高网站在搜索引擎中的排名。\n\n9. 测试和发布网站:在发布网站之前,进行测试以确保网站的正常运行和用户体验。\n\n10. 维护和更新网站:定期更新网站内容,修复漏洞和错误,保持网站的安全和稳定。\n\n"
      }
    }
  ]
}

多轮对话

请求command:

curl http://localhost:19327/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user","content": "如何制作个人网站?"},
      {"role": "assistant","content": "制作个人网站可以通过以下步骤进行:\n\n1. 确定网站目的和内容:首先需要明确个人网站的目的和内容,例如是展示个人作品、分享个人经历、提供个人服务等。\n\n2. 选择合适的网站平台:根据个人需求和技术水平,选择合适的网站平台。常见的平台有WordPress、Wix、Squarespace等。\n\n3. 注册域名和购买主机:选择一个合适的域名,并购买一个主机来存储网站文件和数据。\n\n4. 安装和设置网站平台:根据所选择的平台,按照平台的指导进行安装和设置。\n\n5. 设计网站布局和样式:根据个人喜好和网站目的,设计网站的布局和样式。可以使用模板或自定义设计。\n\n6. 创建网站内容:根据网站目的,创建网站的内容,包括文字、图片、视频等。\n\n7. 添加功能和插件:根据需求,添加网站的功能和插件,例如联系方式、社交媒体分享等。\n\n8. 优化网站SEO:进行网站的SEO优化,包括关键词优化、网站结构优化等,以提高网站在搜索引擎中的排名。\n\n9. 测试和发布网站:在发布网站之前,进行测试以确保网站的正常运行和用户体验。\n\n10. 维护和更新网站:定期更新网站内容,修复漏洞和错误,保持网站的安全和稳定。\n\n"},
      {"role": "user","content": "我还是一个新手,有没有比较快的方案?"}
    ],
    "repetition_penalty": 1.1
  }'

json返回体:

{
  "id": "chatcmpl-xjXrJwWEWn8hgsWQw4XFj9",
  "object": "chat.completion",
  "created": 1711420549,
  "model": "llama-3-chinese",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "user",
        "content": "如何制作个人网站?"
      }
    },
    {
      "index": 1,
      "message": {
        "role": "assistant",
        "content": "制作个人网站可以通过以下步骤进行:\n\n1. 确定网站目的和内容:首先需要明确个人网站的目的和内容,例如是展示个人作品、分享个人经历、提供个人服务等。\n\n2. 选择合适的网站平台:根据个人需求和技术水平,选择合适的网站平台。常见的平台有WordPress、Wix、Squarespace等。\n\n3. 注册域名和购买主机:选择一个合适的域名,并购买一个主机来存储网站文件和数据。\n\n4. 安装和设置网站平台:根据所选择的平台,按照平台的指导进行安装和设置。\n\n5. 设计网站布局和样式:根据个人喜好和网站目的,设计网站的布局和样式。可以使用模板或自定义设计。\n\n6. 创建网站内容:根据网站目的,创建网站的内容,包括文字、图片、视频等。\n\n7. 添加功能和插件:根据需求,添加网站的功能和插件,例如联系方式、社交媒体分享等。\n\n8. 优化网站SEO:进行网站的SEO优化,包括关键词优化、网站结构优化等,以提高网站在搜索引擎中的排名。\n\n9. 测试和发布网站:在发布网站之前,进行测试以确保网站的正常运行和用户体验。\n\n10. 维护和更新网站:定期更新网站内容,修复漏洞和错误,保持网站的安全和稳定。\n\n"
      }
    },
    {
      "index": 2,
      "message": {
        "role": "user",
        "content": "我还是一个新手,有没有比较快的方案?"
      }
    },
    {
      "index": 3,
      "message": {
        "role": "assistant",
        "content": "对于新手来说,可以考虑使用一些简单易用的网站建设工具,这些工具通常提供了预设的模板和拖放界面,可以帮助你快速创建个人网站。\n\n以下是一些推荐的网站建设工具:\n\n1. Wix:Wix是一个非常受欢迎的网站建设工具,它提供了大量的模板和拖放界面,使得创建网站变得非常简单。你只需要选择一个模板,然后使用拖放界面添加和编辑内容即可。\n\n2. Squarespace:Squarespace也是一个流行的网站建设工具,它提供了现代化的模板和易于使用的界面。你可以选择一个模板,然后使用拖放界面添加和编辑内容。\n\n3. WordPress:WordPress是一个强大的网站建设平台,虽然相对于其他工具来说稍微复杂一些,但它提供了丰富的插件和主题,可以满足各种不同的需求。你可以选择一个主题,然后使用插件添加和编辑内容。\n\n"
      }
    }
  ]
}

聊天接口参数说明

  • max_tokens: 新生成的句子的token长度。

  • temperature: 在0和2之间选择的采样温度。较高的值如0.8会使输出更加随机,而较低的值如0.2则会使其输出更具有确定性。temperature越高,使用随机采样最为decoding的概率越大。

  • num_beams: 当搜索策略为束搜索(beam search)时,该参数为在束搜索(beam search)中所使用的束个数,当num_beams=1时,实际上就是贪心搜索(greedy decoding)。

  • top_k: 在随机采样(random sampling)时,前top_k高概率的token将作为候选token被随机采样。

  • top_p: 在随机采样(random sampling)时,累积概率超过top_p的token将作为候选token被随机采样,越低随机性越大,举个例子,当top_p设定为0.6时,概率前5的token概率分别为[0.23, 0.20, 0.18, 0.11, 0.10]时,前三个token的累积概率为0.61,那么第4个token将被过滤掉,只有前三的token将作为候选token被随机采样。

  • repetition_penalty: 重复惩罚,具体细节可以参考这篇文章:https://arxiv.org/pdf/1909.05858.pdf

  • do_sample: 启用随机采样策略。默认为true。

  • stream: OpenAI格式的流式返回。默认为false,设置为true时,会按照OpenAI的格式流式返回数据,可以作为任意基于ChatGPT的应用的后端。

文本嵌入向量(text embedding)

文本嵌入向量有很多作用,包括但不限于基于大型文档问答、总结一本书中的内容、为大语言模型找到与当前用户输入最相近的记忆等等。

请求command:

curl http://localhost:19327/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{
    "input": "今天天气真不错"
  }'

json返回体:

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "embedding": [
                (向量值)
                ....,
            ],
            "index": 0
        }
    ],
    "model": "llama-3-chinese"
}