写了 7 年代码,第一次见这么狗血的小 Bug!

news2024/10/6 16:20:47

刚刚修我们鱼聪明 AI 助手平台的一个 Bug,结局很狗血!赶紧给大家分享一下,顺便也分享下标准的排查 Bug 思路。

事情是这样的,有小伙伴在鱼聪明平台(https://www.yucongming.com)创建了一个 AI 助手,名称为【软件开发人员】。当我搜索 “软件开发” 时,能搜出这个模型:

鱼聪明 AI 助手

结果搜索 “软件开发人员”,也就是助手的全名称时,竟然搜不出结果了?!

鱼聪明 AI 助手

遇到这种事,先从前端出发:第一时间确认前端发送的请求参数是否正确。

按 F12 打开网络控制台,发现搜索关键词传的没毛病:

然后鱼皮顺着网线爬到后端,先要确认一下从数据库中有没有查出最原始的数据,再考虑是不是被业务代码过滤掉了。

在本地开启数据库的查询日志,用的是 MyBatis Plus 框架,开启日志的代码如下:

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

再次执行搜索,打印出的 SQL 记录如图:

把参数拼到 SQL 语句模板中,就是 name like ‘%软件开发人员%’,看上去没有任何问题。

再次验证,接下来我们把拼接好的 SQL 放到数据库控制台进行真实查询:

结果查询结果为 0:

奇怪了,难道数据库中没有这条记录?但是为啥搜索 “软件开发” 的时候,能搜出这个助手呢?

然后我又用助手的 id 去数据库中查询,发现确实有名称为 “软件开发人员” 的数据。

气了气了,为啥查不出来啊?!大家也可以猜一猜。

这个时候我其实已经有想法了,难道是数据库中存储的 name 和我们看到的 name 格式(或者字符)不一致?于是我就从数据库中把 name 的值复制出来,如图:

结果,从数据库中复制出来的 name 作为查询条件,是能查出结果的!

于是就有了下面这张神奇的截图,两个 “一模一样” 的 SQL 语句,一个有结果,一个没结果:

基本就可以确认了,此 “软件开发人员” 非彼 “软件开发人员”,这两个字符串是不一致的!

于是我分别用这两个字符串来生成 MD5 Hash 码,发现 Hash 码不同,说明原字符串不同。

再进行更精确地对比,发现是 “人” 字不同:

坑啊!谁能看出来这两个 “人” 字有区别!

到底有啥区别呢?问下鱼聪明 AI 吧~

结果一秒破案:原来第一个 “人” 是全角字符,这真的是。。。泰裤辣!

大概整个案件就是这样。所以说,我们看到得未必是真实的,这个 Bug 让我想起了很多朋友初上大学时经常把中英文逗号、中英文冒号搞混,这种 Bug 真是让人哭笑不得。希望各位程序员朋友们,尽量不要遇到吧,遇到了的话,想想我这篇文章,说不定就有了解决的思路呢。

鱼聪明AI - 做您强大的AI助手

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModStartCMS v6.5.0 菜单多级支持,框架结构优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

InnoDB Cluster集群Mysql Router代理层最佳实践

InnoDB Cluster 集群 & Mysql-Router 代理层 前言 Mysql是现今最常用的关系型数据库之一,高可用一直是我们对软件服务的要求。常见的Mysql高可用是主从配置,在主节点挂掉后需要依赖监控脚本进行主从切换将从节点升级,后台服务代码层面也…

正在破坏您的协程(Coroutines)的无声杀手(Silent Killer)

正在破坏您的协程的无声杀手 处理 Kotlin 中的取消异常的唯一安全方法是不重新抛出它们。 今天生产服务器再次停止响应流量。 上个星期,你刚重新启动它们并将其视为故障。但是你总觉得有些奇怪,因为日志中没有任何错误的痕迹,甚至没有警告。…

vue cli配置代理解决跨域问题

跨域问题 是由于违背了同源策略,同源策略规定了协议名、主机名、端口号必须一致 我们目前所处的位置是http localhost 8080,我们想向一台服务器发送请求,它的位置是http localhost 5000,我们的ajax请求从浏览器发送到服务器&#…

界面组件DevExpress WPF中文指南 - 如何应用系统强调色及主题切换

在最新版本的Microsoft Office产品中,用户可以根据系统设置选择主题,当使用这个主题时,Office将采用Windows强调色和应用模式(亮/暗)设置,并将它们应用到Office本身。如果用户在操作系统中更改了强调色或应用模式,Offi…

【spring源码系列-02】通过refresh方法剖析IOC的整体流程

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【一】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428 spring底层源码整体概述 一&#xff…

2个实际工作中的小技巧,先收再看(网工版)

大家好,我是老杨。 本来想发点关于快乐的文章,但我思来想去,对成年人最大的快乐,莫过于高效完成工作,早点下班回家。 关于提升工作效率这方面啊,我的文章其实零碎、分散的写过了很多次了。 你要知道&…

ChatGPT国内免费使用地址和开源公众号集成项目分享

ChatGPT国内免费使用地址和开源公众号集成项目分享 ChatGPT国内免费使用地址ChatGPT开源公众号集成项目ChatGPT国内免费调用API的地址总结免费体验地址 人工智能技术的快速发展,ChatGPT聊天机器人备受瞩目。然而,如何在国内免费使用ChatGPT却是许多人关注…

手绘echarts散点图

面对各种定制,echarts图表有时候不好处理,无论是数据处理还是样式处理,都会被echarts限制。 举例:echarts散点图如果数据较少,echarts会均匀分布,如图1 对于产品或者老板对页面的要求,认为中间…

ROS2中,从SolidWorks导出的urdf,联合moveit、gazebo进行控制及仿真

文章目录 1.前言2.从urdf到moveit3.从urdf到gazebo3.1.urdf文件的修改3.1.1.mesh路径3.1.2.零件起飞3.1.3.文件保存 3.2.xacro文件的修改3.3.launch 4.用moveit控制gazebo5.结语 1.前言 本文是对之前发的文章【在ROS2中,通过MoveIt2控制Gazebo中的自定义机械手】的…

C 语言详细教程

目录 第一章 C语言基础知识 第二章 数据类型、运算符和表达式 第三章 结构化程序设计 第四章 数组 第五章 函数 第六章 指针 第七章 结构体类型和自定义类型 第八章 编译预处理 第九章 文件 说明:本教程中的代码除一二三个之外,都在https://ligh…

尝试理解卷积神经和深度学习的关系,并且怎么使用

前言 最近想要了解卷积神经和深度学习,才发现并不是我想象中的简单,也不是我想象中的难.我想的难是指没有任何思路:不知道这是个什么玩意,里面的流程是不是很难,我想的简单就是:也就是用人家的包,全都是用来导包,我只需要知道这个包是怎么用的,从来没想过自己怎么开发出来一个依…

Python splitlines() 的使用

Python splitlines() 的作用 Python splitlines() 按照行(\r, \r\n, \n)分隔,返回一个包含各行作为元素的列表 Python splitlines()的注意事项 splitlines小括号里面的参数没有的时候,默认按照行(\r, \r\n, \n)分隔不带这些特殊的字符 如果这样splitlines(True)…

ISO21434 概述(一)

目录 一、ISO21434 1.1 目的 1.2 ISO21434文档组织结构 二、适用范围 三、引用标准 四、术语和缩写 4.1 术语 4.2 缩写 五、一般考虑 一、ISO21434 1.1 目的 本文件阐述了道路车辆内电气和电子(E/E)系统工程中的网络安全问题。通过确保对网络安…

Ansible的配置、主机清单、Ansible的脚本Playbook详解

文章目录 Ansible的配置配置文件 主机清单远程主机的分组变量 Ansible的脚本PlaybookPlaybook的文件格式YAMLansible-playbook的命令Playbook的基本语法变量 Ansible的配置 配置文件 Ansible是一款功能强大的自动化工具,可以实现对远程主机的管理和操作&#xff0…

华为认证 | HCIA-Datacom 考试大纲

今天给大家说点基础的,很多人对华为认证考试有了一定了解后,想要进一步了解具体的考试内容。 这篇先说HCIA-Datacom的具体考试大纲~ 01 华为HCIA-Datacom认证考试 02 华为HCIA-Datacom考试内容 HCIA-Datacom V1.0考试覆盖数通基础知识,包括&…

java 中的动态代理实现

1. 什么是代理模式 代理模式是常见的设计模式之一,顾名思义,代理模式就是代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。(为真实对象提供代理&…

表格软件有哪些?热门表格软件推荐

作为报表开发人员,我们经常需要使用各种表格软件来处理数据并生成清晰、易读的报表。在市面上,有许多不同类型的表格软件可供选择。下面我将列举7款热门的表格软件,并详细介绍其中一款优秀的软件—VeryReport。 编辑搜图 请点击输入图片描述…

Qt6.5.1+WebRTC学习笔记(九)运行官方示例(win10+vs2019)

前言 webrtc源码目录下,有个examples目录,里面放置着官方的示例,其有peerconnection示例。 一、问题 peerconnection示例分客户端和服务端,以win系统为例,编译后会在输出目录生成两个可执行文件 服务端程序可以正常…

【基于GD32E230的定时器级联M/T法电机测速】

前言 在有感电机控制中,获取电机转速是非常重要的步骤,转速获取越准确,控制电机时越方便,抛开霍尔不谈,这里讨论电机编码器。 目前常见的电机编码器按种类分为绝对值编码器和增量编码器,绝对值编码器相对…