升级openai库导致的404错误排查记载

打印 上一主题 下一主题

主题 555|帖子 555|积分 1665

配景

OpenAI自从23年11月引入后就没有更新过,一直是0.27.0,近期由于项目必要想引入Agently框架,此框架依赖的OpenAI库较新,于是就必要升级OpenAI库。
新升级的OpenAI库版本为:

错误引出

升级完运行下,起首遇到了这个错误404 - {'error': {'code': '404', 'message': 'Resource not found'}},堆栈如下:

错误分析1

可以看出,在使用OpenAIEmbedding在进行向量嵌入时报的错,我们使用的是Azure摆设的OpenAI服务,出现此错误一样平常是由于Azure Endpoint,Deployment,API Version,API Key,Model Version这几项信息中的某一项有问题。断点调试OpenAIEmbedding的URL如下:
  1. https://openaiquanshi.openai.azure.com//deployments/meeting-embedding/embeddings?api-version=2023-07-01-preview
复制代码
直接用curl向这个URL发送请求,确实报了404:
  1. ~ % curl -i -X POST -H 'Content-Length:100' 'https://openaiquanshi.openai.azure.com//deployments/meeting-embedding/embeddings?api-version=2023-07-01-preview
  2. 'HTTP/2 404 content-length: 56content-type: application/jsonapim-request-id: 61063a5d-bb28-4299-a267-a8ddb8de870cstrict-transport-security: max-age=31536000; includeSubDomains; preloadx-content-type-options: nosniffdate: Wed, 17 Jul 2024 01:42:52 GMT{"error":{"code":"404","message": "Resource not found"}}%     
复制代码
**真实缘故原由:**openai接口的URL Path存在版本兼容性,v1版本必要在域名后多加一个/openai用于区分azure和openai(如:https://xxx.openai.azure.com/openai),并且这个URL的修改openai库内部会自动完成。但是openai库内部有个逻辑:只有openai_api_base中没有/openai这个串时才会添加。代码如下所示:
  1. if is_openai_v1():
  2.     # For backwards compatibility. Before openai v1, no distinction was made
  3.     # between azure_endpoint and base_url (openai_api_base).
  4.     openai_api_base = values["openai_api_base"]
  5.     if openai_api_base and values["validate_base_url"]:
  6.         if "/openai" not in openai_api_base:
  7.             values["openai_api_base"] += "/openai"
  8.             warnings.warn(
  9.                 "As of openai>=1.0.0, Azure endpoints should be specified via "
  10.                 f"the `azure_endpoint` param not `openai_api_base` "
  11.                 f"(or alias `base_url`). Updating `openai_api_base` from "
  12.                 f"{openai_api_base} to {values['openai_api_base']}."
  13.             )
复制代码
这里有个弊端,由于azure的openai_api_base域名是由客户企业自己命名的,如果客户命名的域名以openai开头(如:https://openaixxx.openai.azure.com),openai库内部的URL拼接逻辑将不会实行到,最终v1+版本的openai库发出的请求却没有在域名后携带/openai, 导致404 Resource Not found。
**解决办法:**模仿上面的方法,写一个函数is_openai_v1提前进行openai库的版本判断和URL修正。
  1. def is_openai_v1() -> bool:
  2.     from importlib.metadata import version
  3.     from packaging.version import Version, parse
  4.     _version = parse(version("openai"))
  5.     return _version >= Version("1.0.0")
  6.    
  7. api_base = os.environ["OPENAI_API_BASE"]
  8.    
  9. if is_openai_v1():
  10.     api_base = os.path.join(api_base, "openai")
  11. print(api_base)
复制代码
输出的api_base如下:
  1. https://openaiquanshi.openai.azure.com/openai/deployments/meeting-embedding
复制代码
错误分析2

api_base已经精确,但运行项目照旧报404, 同时弹出了如下警告:
  1. =============================== warnings summary ===============================
  2. /Users/a200007/work/ucgit/ucserver/summaryserver/venv/lib/python3.10/site-packages/langchain/embeddings/openai.py:319: UserWarning: If you have openai>=1.0.0 installed and are using Azure, please use the `AzureOpenAIEmbeddings` class.
  3.     warnings.warn(
复制代码
按照上面提示,对于azure,当openai库大于1.0.0时,我们必要使用AzureOpenAIEmbeddings代替OpenAIEmbeddings
  1. from langchain.embeddings.azure_openai import AzureOpenAIEmbeddings
  2. api_base = os.environ["OPENAI_API_BASE"]
  3. if is_openai_v1():
  4.     api_base = os.path.join(api_base, "openai")
  5. embedding_function = AzureOpenAIEmbeddings(
  6.     deployment=embedding_deployment,
  7.     chunk_size=embedding_max_inputs,
  8.     openai_api_base = api_base
复制代码
使用此embedding_function做测试:
  1. tensor = embedding.embed_query("今天你去哪儿了?")
  2. print(tensor)
  3. > [0.0018476681179545632, -0.003048808135045326, 0.013323151742329006, -0.012344790841118551, -0.027643358824239652, 0.015491746640257776, -0.02547476299498829, -0.0032466613330973887, -0.03310223727411042, -0.017236592553203055, 0.012407106567011756, -0.005380982628351025, 0.00047866445067163386, ……(1535)]
复制代码
错误分析3

继续运行,又报了404,这次是一个新的位置:

前面是embeddings的错误,这次是langchain中chat_models的错误,料想应该都是URL兼容性的问题,于是在构造llm实例时,也加了openai版本的判断和url的处置惩罚:
  1. api_base = os.environ["OPENAI_API_BASE"]
  2. if is_openai_v1():
  3.         api_base = os.path.join(api_base, "openai")
  4. llm = AzureChatOpenAI(
  5.     temperature=0,
  6.     max_tokens=4096,
  7.     ……
  8.     openai_api_base=api_base
  9. )
复制代码
这样修改后终于运行正常。
参考资料



  • 怎样迁徙OpenAI到v1: https://learn.microsoft.com/zh-cn/azure/ai-services/openai/how-to/migration?tabs=python-new%2Cdalle-fix

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表