走进科学json版:在 JSON 格式中,字符串值必须使用双引号 “ 来界定,而不能使用单引号 ‘

走进科学疑难问题出现

在调试fastapi程序的时候,报错碰到422错误

INFO:     192.168.0.99:46536 - "POST /v1/chat/completions/ HTTP/1.1" 422 Unprocessable Entity

干净利索,只有这一句报错,不管代码里加入多少print语句查看中间变量,都只有这一句话,就像根本没有走下去(事实上确实没有走下去)。

使用的测试语句是:

curl -X 'POST' \
  'http://192.168.0.99:8000/v1/chat/completions/' \
  -H 'accept: application/json' \
  -d "{'msg':[ {'role': 'user', 'content': 'hello'} ]}"

不知道问题在哪,后来专门找了另一条测试语句,并写了/items/的代码,测试通过,没报错:

curl -X POST http://192.168.0.99:8000/items/ -H "Content-Type: application/json" \
-d '{"name": "Bruce_Lee", "description":"this is a book of Bruce_Lee", "price": 12}'

解决问题

然后就比对代码,比对/items/ 和/v1/chat/completions/ 里面代码的书写,甚至比对着写了个最简单的json数据,把这句"{'msg':[ {'role': 'user', 'content': 'hello'} ]}"学着对的那句简化成-d '{"msg": "hello"}

你还别说,输出了很多打印信息,证明程序跑下去了。当然因为简化json,中间还改了程序,再用回长段json的时候再改回去,总之是改的头昏眼花。

后来到文心一言里,让它帮我把单引号改成双引号,

提问:

请把单括号换成双括号{'msg':[ {'role': 'user', 'content': 'hello'} ]} (这里因为头昏,错把引号说成了括号,索性一言给我了份正确格式的答案)

回答

当您提到将“单括号”换成“双括号”时,我猜测您是指将某种不规范的或错误的括号使用方式更正为标准的 JSON 格式。在 JSON 中,对象(即键值对的集合)应该使用大括号 {} 来表示,而数组(即有序值的集合)应该使用方括号 [] 来表示。

根据您提供的示例 {'msg':[ {'role': 'user', 'content': 'hello'} ]},这实际上已经是一个有效的 JSON 字符串(尽管它可能被错误地称为“单括号”或“双括号”,这取决于上下文和解释者的视角)。在这个字符串中:

  • 最外层的 {} 表示一个 JSON 对象。
  • msg 是这个对象的一个键,其对应的值是一个 JSON 数组。
  • 这个数组由方括号 [] 表示,并且包含一个 JSON 对象。
  • 这个内部的对象又由大括号 {} 表示,并且有两个键值对:role 和 content

如果您的意图是确保这个 JSON 字符串被正确地用于 curl 命令中,那么您应该这样做:

curl -X 'POST' \
  'http://192.168.0.99:8000/v1/chat/completions/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"messages":[{"role": "user", "content": "hello"}]}'

使用这份curl格式的代码,终于消除了422报错!

后来才知道(也许我以前就知道,只是忘记了) ,json一定要用双引号!

在 JSON 格式中,字符串值必须使用双引号 " 来界定,而不能使用单引号 '。这是 JSON 标准的一部分,它确保了数据的一致性和可解析性。

json编程,砥砺前行!

总结下

这回对json格式算是印象深刻了,主要是受了python的影响,单引号和双引号混用,这才阴沟里翻了船。

最终问题解决,且原来计划的使用树莓派启动fastapi 中转openai指令,使ESP32开发板能够连上大模型,方案也被验证可行。

目前将fastapi 中转openai放置于树莓派2服务器上,

fastapi 中转openai配置

fastapi的代码为:

cat app.py 
from typing import Annotated
import json
from fastapi import FastAPI, Path, Query
from pydantic import BaseModel
from openai import OpenAI

import os
import time
from typing import Union, Optional

app = FastAPI()
API_KEY = "xxxx"
model="ernie-speed-8k"


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

class ChatItem(BaseModel):
    messages: list
    model: str | None = None

def ChatCompletions(
        messages: list,
        model: str,
        # provider: Optional[ProviderType] = None,
        stream: Optional[bool] = False,
        # proxy: Optional[str] = None,
        response_format: Optional[dict] = None,
        max_tokens: Optional[int] = None,
        stop: Optional[Union[list[str], str]] = None,
        api_key: Optional[str] = None,
        # ignored: Optional[list[str]] = None,
        # ignore_working: Optional[bool] = False,
        ignore_stream: Optional[bool] = False,
        **kwargs):
    client = OpenAI(
         api_key=api_key,  # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
         base_url="https://aistudio.baidu.com/llm/lmapi/v3",  # aistudio 大模型 api 服务域名
)
    chat_completion = client.chat.completions.create(
        messages=messages,
        model=model,
)
    print(f"==log for app chat_completion:{chat_completion} ")
    # response = chat_completion.result
    # print(f"==log for app  response:{response}")
    return chat_completion
    

@app.get("/items/{item_id}")
async def read_items(
    item_id: Annotated[int, Path(title="The ID of the item to get")],
    q: Annotated[str | None, Query(alias="item-query")] = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

@app.post("/v1/chat/completions/")
async def chat_completions(chatitem: ChatItem):
    print(chatitem)
    chatitemdict = chatitem.dict()
    print(f"==== items:{chatitemdict}")
    #print ("=" * 20 , messages, type(messages))
    #yjson = json.loads(messages)
    #print("="*10, yjson, type(yjson))
    #zmessages = yjson["messages"]
    #print("="*10, zmessages, typr(zmessages))
    model="ernie-speed-8k"
    messages = chatitem.messages
    print(f"==== messages=chatitem.msg:{messages}")
    y = ChatCompletions(messages=messages, model=model, api_key=API_KEY)
    print("="*10, y)
    z = y.choices[0].message.content
    return z
    
@app.post("/items/")
async def create_item(item: Item):
    print(f"==== get the Item type:{type(item)}, item:{item}")
    item_dict = item.dict()
    print(f"==== item_dict{item_dict}")
    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})
    return item_dict

需要到AiStudio官网获取apk_key并填入上面的代码中,在树莓派启动fastapi服务器:

uvicorn app:app --host 0.0.0.0 --reload

最终测试命令为:

curl -X 'POST' \
  'http://192.168.0.99:8000/v1/chat/completions/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"messages":[{"role": "user", "content": "hello"}]}'

省略一条head,这个命令也可以: 

curl -X 'POST' \
  'http://192.168.0.99:8000/v1/chat/completions/' \
  -H 'Content-Type: application/json' \
  -d '{"messages":[{"role": "user", "content": "hello"}]}'

 ESP32S3开发板通过中转连星河大模型

在ESP32S3开发板的MicroPython环境下,使用requests来fastapi的中转服务器,连接成功:

import requests

response = requests.post(
    'http://192.168.0.99:8000/v1/chat/completions/',
    headers = {
        'Content-Type': 'application/json',},
    json = {
        'model': "ernie-speed-8k",
        "messages": [{"role": "user", "content": "hello"}]}
)


print(response.status_code, response.reason)
print(response.text)

 输出显示:

>>> print(response.status_code, response.reason)
200 b'OK'
>>> print(response.text)
"你好!请问有什么需要我帮助你的吗?"

太棒了,使用这种解决方案,在家里使用一台树莓派做中转,就可以让家里的物联网设备都使用百度星河大模型啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【模块一】kubernetes容器编排进阶业务容器化案例

Kubernetes 实战案例 Kubernetes实战案例-规划(基于nerdctl buildkitdcontainerd构建容器镜像) 业务容器化优势: ① 提高资源利用率、节约部署IT成本。 ② 提高部署效率,基于kubernetes实现微服务的快速部署与交付、容器的批量调度与秒级启动。 ③…

政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例

目录 Cusor的主要特点 Cusor实操 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! Cursor 是 Visual Studio Code 的一个分支。这使我们能够…

Android 12.0 DocumentsUI文件管理器首次进入默认显示内部存储文件功能实现

1.前言 在12.0的系统rom定制化开发中,在关于文件管理器的某些功能中,在首次进入文件管理器的时候默认进入下载 文件夹,点击菜单选择内部存储的时候,会显示内部存储的内容,客户开发需要要求默认显示内部存储的文件 接下来分析下功能的实现 如图: 2.DocumentsUI文件管理器首…

9.机器学习--SVM支持向量机

支持向量机(Support Vector Machine,SVM)是一种二分类监督学习模型。支持向量机最早在 1964 年被提出,1995年前后理论成熟并开始被大量应用与人像识别、文本分类等问题中。它的基本模型是定义在特征空间上的间隔最大的线性分类器&…

数据结构---链表

1. 简介 链表(Linked List)是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(或引用)。链表的一个主要优点是能够高效地插入和删除元素,尤其是在数组…

“移门缓冲支架:为家庭安全加码”

在智能家居日益普及的今天,科技不仅改变了我们的生活方式,也提升了家居的安全。移门缓冲支架作为一项结合了现代技术的小型装置,正逐渐成为提升家庭安全的重要配件。它通过吸收门关闭时的冲击力、减缓关门速度以及减少噪音等多重功能&#xf…

vscode、android studio、vim 国产AI编程插件Fitten Code

文章目录 Fitten Code简介vim安装Fitten Code插件Android Studio安装Fitten Code插件Fitten Code功能相关文章 Fitten Code简介 Fitten Code是由非十大模型驱动的AI编程助手,它可以自动生成代码,提升开发效率,帮您调试Bug,节省您…

一个月速成python+OpenCV图像处理

OpenCV是一个广受欢迎且极为流行的计算机视觉库,它因其强大的功能、灵活性和开源特性而在开发者和研究者中备受青睐。 学习OpenCV主要就是学习里面的计算机视觉算法。要学习这些算法的原理,知道它们适用于哪些场景,然后通过Python编写代码来…

深度学习2:从零开始掌握PyTorch:数据操作不再是难题

文章目录 一、导读二、张量的定义与基本操作三、广播机制四、索引与切片五、内存管理六、与其他Python对象的转换本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,…

win10系统安装docker-desktop

1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术,它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…

如何使用谷歌浏览器访问被屏蔽的网站

在互联网浏览过程中,我们有时会遇到一些网站被屏蔽的情况,这可能是因为地域限制、网络审查或其他原因。对于使用谷歌浏览器的用户来说,有几种方法可以尝试访问这些被屏蔽的网站。本文将详细介绍如何使用谷歌浏览器访问被屏蔽的网站。&#xf…

Next.js -服务端组件如何渲染

#题引:我认为跟着官方文档学习不会走歪路 服务器组件渲染到客户端发生了什么? 请求到达服务器 用户在浏览器中请求一个页面。 Next.js 服务器接收到这个请求,并根据路由找到相应的页面组件。服务器组件的渲染 Next.js 识别出请求的页面包含…

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 遍历 前序遍历:A->B->C->E->F->D->G后序遍历:B->E->F->C->G->D->A层序遍历:A->B->C->D->…

SpringSecurity6

1.快速入门 2.SpringSecurity底层原理 使用的是委托过滤器,委托过滤器实际上就是 sevlet 过滤器 将自己放入Sevlet环境下 然后里面是一个 过滤器链代理 代理类下又是一个代理过滤器链的集合, 对于不同请求可以有不同的过滤器链, springsecurity有个默认的过滤器链 Defau…

芯片测试-RF中的S参数,return loss, VSWR,反射系数,插入损耗,隔离度等

RF中的S参数,return loss, VSWR,反射系数,插入损耗,隔离度 💢S参数💢💢S11与return loss,VSWR,反射系数💢💢S21,插入损耗和增益&#…

前端页面或弹窗在线预览文件的N种方式

需求:后端返回给前端一个地址后,在前端页面上或则在弹框中显示在线的文档、表格、图片、pdf、video等等,嵌入到前端页面 方式一: 使用vue-office 地址:vue-office简介 | vue-office 个人感觉这个插件是最好用的&#x…

剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍

一、三种批量替换模式的区别 二、混剪裂变替换素材 三、分区混剪裂变替换素材 四、按组精确替换素材 五、绿色按钮教程 (一)如何附加音频和srt字幕 (二)如何替换固定文本的内容和样式 (三)如何附加…

【天地图】HTML页面实现车辆轨迹、起始点标记和轨迹打点的完整功能

目录 一、功能演示 二、完整代码 三、参考文档 一、功能演示 运行以后完整的效果如下: 点击开始,小车会沿着轨迹进行移动,点击轨迹点会显示经纬度和时间: 二、完整代码 废话不多说,直接给完整代码,替换…

Node报错:npm error code ETIMEDOUT

1、报错详细信息 npm error code ETIMEDOUT npm error syscall connect npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/express failed, reason: connect ETIMEDOUT 104.16.1.35:443 npm error network This is a problem related to ne…

FPGA工具链及功能介绍

一、处理流程 把verilog等源码,变为FPGA中可执行的比特流文件,主要包含这些步骤: 步骤功能转译将verilog代码转化为更详细的语法,增加更多细节内容技术映射将每个vrilog用到的模块,对应到FPGA的物理器件上优化优化冗余…