动机、参考资料、涉及内容

一些面向大模型应用层面 (也就是提示工程) 的工具记录

LLM

litellm

litellm 是一个 Python 包, 用于将各个大模型提供的大模型接口的输入输出格式统一为 OpenAI 格式

文档: https://docs.litellm.ai/docs/

主要有两种用法

作为 python 模块使用

from litellm import completion
import os

messages = [{ "content": "Hello, how are you?", "role": "user"}]

# OpenAI
os.environ["OPENAI_API_KEY"] = "your-api-key"

response = completion(
  model="gpt-3.5-turbo",
  messages=messages
)

# Azure OpenAI
os.environ["AZURE_API_KEY"] = ""
os.environ["AZURE_API_BASE"] = ""
os.environ["AZURE_API_VERSION"] = ""

response = completion(
  "azure/<your_deployment_name>",
  messages=messages
)

output_text: str = response['choices'][0]['message']['content']

作为代理使用

litellm 还可以作为代理使用, 具体做法如下

启动代理服务

方案 1:

pip install litellm[proxy]
export OPEN_API_KEY=my-api-key
litellm --model gpt-3.5-turbo

方案 2:

先编写一个 config.yaml 文件

model_list:
  - model_name: gpt-3.5-turbo # user-facing model alias
    litellm_params: # all params accepted by litellm.completion() - https://docs.litellm.ai/docs/completion/input
      model: azure/<your-deployment-name>
      api_base: <your-azure-api-endpoint>
      api_key: <your-azure-api-key>
  - model_name: gpt-3.5-turbo
    litellm_params:
      model: azure/gpt-turbo-small-ca
      api_base: https://my-endpoint-canada-berri992.openai.azure.com/
      api_key: <your-azure-api-key>
  - model_name: vllm-model
    litellm_params:
      model: openai/<your-model-name>
      api_base: <your-api-base> # e.g. http://0.0.0.0:3000

使用配置文件 config.yaml 文件启动

litllm --config config.yaml

使用代理

curl 的使用

curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
      "model": "gpt-3.5-turbo",
      "messages": [
        {
          "role": "user",
          "content": "what llm are you"
        }
      ]
    }
'

openai-python 的使用

import openai
client = openai.OpenAI(
    api_key="anything",  # 这里随便传即可, 会被忽略, api_key 在代理启动时设置
    base_url="http://0.0.0.0:4000"
)

response = client.chat.completions.create(model="gpt-3.5-turbo", messages = [
    {
        "role": "user",
        "content": "this is a test request, write a short poem"
    }
])

作为代理使用的好处是, api_key 在使用代理时无需关心, 只需要在代理服务启动时配置好即可. 并且可以在配置文件中自定义模型名.

备注: 关于 base_url 为什么写作 0.0.0.0 而不是 127.0.0.1, 这是因为当 0.0.0.0 作为目标 IP 时, 通常会解释为本机 IP, 所以这么写是 OK 的. 当然, 最明确的写法的确是使用 127.0.0.1 或者本机 IP (准确地说是代理服务的 IP)

关于 127.0.0.10.0.0.0 的问答: https://unix.stackexchange.com/questions/419880/connecting-to-ip-0-0-0-0-succeeds-how-why

OCR

rapidocr

只需要 pip install 即可, 安装包内自带模型文件 site-packages/rapidocr_onnxruntime/models/{ch_ppocr_mobile_v2.0_cls_infer.onnx,ch_PP-OCRv4_det_infer.onnx,ch_PP-OCRv4_rec_infer.onnx}, 无需再额外下载模型. 以下是一个例子, 样例图片来源于此处 (注意: 在这个例子中实际上有漏识别的文字)

# pip install rapidocr_onnxruntime
from rapidocr_onnxruntime import RapidOCR
ocr = RapidOCR()
result, _ = ocr("分布式训练技术原理-幕布图片-42284-124759.jpg")

输出

# result
[[[[935.0, 171.0], [1015.0, 171.0], [1015.0, 233.0], [935.0, 233.0]],
  'Y1',
  0.6642794211705526],
 [[[1107.0, 171.0], [1201.0, 171.0], [1201.0, 235.0], [1107.0, 235.0]],
  'Y2',
  0.6654683748881022],
 [[[462.0, 193.0], [561.0, 193.0], [561.0, 235.0], [462.0, 235.0]],
  'WE1',
  0.7467206418514252],
 [[[635.0, 192.0], [744.0, 194.0], [744.0, 235.0], [634.0, 234.0]],
  'WE2',
  0.7468263655900955],
 [[[536.0, 384.0], [678.0, 382.0], [679.0, 428.0], [537.0, 430.0]],
  '(h,v/N)',
  0.8688599616289139],
 [[[1371.0, 375.0], [1636.0, 376.0], [1635.0, 427.0], [1370.0, 426.0]],
  '知s@猛猿',
  0.6824508408705393],
 [[[91.0, 385.0], [233.0, 383.0], [233.0, 428.0], [91.0, 429.0]],
  '(b, s, h)',
  0.8148094713687897],
 [[[978.0, 386.0], [1161.0, 383.0], [1162.0, 426.0], [978.0, 429.0]],
  '(b,S,v/N)',
  0.7499212145805358]]

# _, 暂时不明白含义是什么, 每次运行结果还不一样
[1.8297991752624512, 0.01677227020263672, 0.4000370502471924]