11.7
- 使用openFeign调用接口发生错误。接口返回的数据格式不标准是text/json,它不是官方的MIME类型,MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式,JSON 的官方 MIME 类型是application/json。这样就不能用openFeign内部的处理把json格式转换为我们想要的对象格式,会报找不到类型错误,因为内部没有处理text/json的方法。解决办法就是以String格式返回,一旦返回格式是String,openFeign内部就直接从body中取出响应内容不做过多的处理就不会报错,缺点是我们需要手动处理数据。(思考:http直接调用和openFeign调用的区别?)
- 去调用http请求时,如果报错403则需要检查以下两点。第一,检查请求头中是否设置了user-agent字段,如果你发送一个HTTP请求而没有设置user-agent字段,服务器可能会认为该请求是来自一个非标准或潜在恶意的客户端,因为合法的HTTP客户端通常会包含这个字段。第二,设置Referer字段,某些网站做了盗链的限制,仅限于本网站链接导入的网址才可以访问,这时我们可以设置Referer字段,该字段提供访问来源的信息。
- 在redis中存储用户信息时有两种方法,一种是value使用string类型,存储的是用户信息的json格式,还有一种value是map类型,这两种类型各有优势。(TODO:对比)
11.8
- OCR:简单来说就是将图片中的文字给识别出来。今天上线遇到了一个问题,对于一个没有@小美的评论还是触发了AI小助手的回复,这是因为这个用户的评论包含图片,图片经过OCR识别之后产生了@小美导致触发。
- ASR:语音识别技术是一种将人的语音转换为文本的技术。
- HanLP:可以提供文字转换成拼音的功能,在召回中台中策略的条件包括了拼音判断可以使用这个工具来解决。
11.9
- 小助手会回复内容包括前缀,比如回复内容:XXX。针对这种情况让GPT使用一个Json格式返回,可以减少前缀情况的出现。
- 天气的FunctionCall有问题
11.13
- 调用维基百科的接口,流程是先用查询的内容去匹配关键词,再用关键词去查summary
11.15
- kafkaTemplate的send函数默认情况下是异步发送的,只要消息积累达到batch.size值或者积累消息的时间超过linger.ms才会发送出去,在测试环境中我写的是调用send函数后就结束了,所以kafka的内容可能还没发出去,测试的进程就已经结束,导致kafka的监听端没收到消息。
- kafkaTemplate的泛型:在Spring Kafka中,
KafkaTemplate是一个用于向Kafka主题发送消息的模板类。泛型参数<K, V>表示键和值的类型。KafkaTemplate<String, String> :这表示键和值都是字符串类型。这通常用于发送简单的文本消息,其中键和值都是字符串。KafkaTemplate<String, Object> :这表示键是字符串,但值可以是任何对象类型(Object)。这种配置允许你发送更通用的消息,其中值可以是任何Java对象,而不仅仅是字符串。Kafka消息在发送和接收时需要进行序列化和反序列化:- 消息可能在网络上传输到不同的机器上。通过将消息序列化为字节流,可以更有效地在网络上传输
- Kafka消息通常会持久化存储在磁盘上,以便在需要时进行重放。序列化允许将消息以紧凑的字节格式存储,从而有效地使用存储空间。
- 在一个分布式系统中,生产者和消费者可能使用不同的编程语言。通过将消息序列化为字节流,可以实现跨语言的消息交换,因为字节流是一种通用的数据表示方式,不受语言限制。
- 数据库设计是都会多一个字段叫做extraInfo用来存储额外的信息,这个字段以Json格式存储,方便做数据的添加,如果要更新这个字段,先读出转换为对应的对象,然后set该对象新添加的属性,再转成Json存入。
11.22
- try-catch中在try的括号中写语句,例如下面这个,可以在try括号中用分号隔开多个语句,其实是一个语法糖("语法糖"指的是编程语言中添加的语法结构,这些结构并不会带来新的功能,而是使得代码更易读、更易写,或者更符合人们的习惯。语法糖并不会改变语言的功能或能力,只是让代码更加简洁、清晰或易于理解。),是try-with-resources 语句,开发者可以在 try 括号中写入需要在作用域结束时自动关闭的资源,比如输入/输出流或者数据库连接,这样我们就不需要在finally块中手动释放资源,当抛出异常或者执行结束后会自动释放资源。声明的所有资源
try()必须实现该AutoCloseable接口,这个接口确保了实现了无参的close方法。
try (Response response = downloadClient.downloadImageWithHeader(URI.create(originUrl))) {
try (InputStream inputStream = response.body().asInputStream()) {
byte[] fileBytes = IOUtils.toByteArray(inputStream);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileBytes);
String fileName = "aigc/" + DateUtil.dateToString(new Date(), YYYYMMDD2) + "/fish.jpg";
NosUtil.getInstance().putObject(fileName, byteArrayInputStream);
result = "http://dingyue.ws.126.net/" + fileName;
} catch (Exception e) {
log.error("download error", e);
}
}
11.24
Java 中使用 Lambda 为什么只能使用 final 变量? - 知乎 (zhihu.com)
java - 为什么在Lambdas中使用的局部变量必须是Final或有效Final - 个人文章 - SegmentFault 思否
编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信_lambda表达式变量为什么是final
- Lambda表达式可以使用外部作用域中定义的变量。我们称这些为捕捉。可以捕获静态变量、实例变量和本地变量,但是只有本地变量必须是final或effective final。final就是变量是被final修饰的不可更改的;effective final就是变量不需要特别声明是final的,创建变量赋值后不再改变赋值。也就是可以看成是final的但是没有明确声明。如果我们需要在Lambda表达式中捕获不是静态的本地变量或者在函数中改变本地变量,可以使用原子类AtomicReference包装一下我们需要传入的变量就可以解决,java是值传递的,传入的是AtomicReference的引用地址,我们改值时改的是它的属性而不是地址,所以这个AtomicReference就相当于是一个effective final的本地变量。Lambda表达式中做这个限制的原因:我们访问静态变量或者实例变量时,是去堆上访问的是线程共享的,总能获取到最新的值;而本地变量是在栈上存储的是线程不共享的,java是值传递的,实际上是去访问他的副本。如果局部变量改变了,那访问的也是之前的值。Lambda 表达式可以在并行流或者其他线程中执行的,所以这样就会造成数据不一致问题,也就是Lambda中的线程无法马上获取到最新的数据出现问题。
- kafka的配置:kafka发送端需要配置key和value的序列化类,接收端需要配置key和value的反序列化类。需要接入两个,一个是私信的内容,还有一个是评论的内容。私信内容配置的value序列化是StringSerializer,我们自己把对象转换成Json格式的字符串返回;跟贴配置的value序列化是JsonSerializer,我们发送的是Map对象,这个序列化处理类自动把Map对象转换成Json格式的字符串传输,这样接收端只要处理Json格式的字符串反序列化即可。(序列化成字节流)
- vo和dto的区别:Vo (View Object)通常用于前端展示层,是将后端传输过来的数据封装成前端需要的数据格式,以便于前端展示。Vo对象通常包含了前端所需的所有属性,而且它们不一定与后端的数据模型完全一致。 视图对象(通常用于前端展示层,是将后端传输过来的数据封装成前端需要的数据格式,以便于前端展示)。Vo对象通常包含了前端所需的所有属性,而且它们不一定与后端的数据模型完全一致。Dto (Data Transfer Object)通常用于数据传输,是将数据从一个层传输到另一个层,例如从后端到前端或从一个微服务到另一个微服务。Dto对象通常只包含必要的属性,而且它们通常与后端的数据模型完全一致。数据传输对象通常用于数据传输,是将数据从一个层传输到另一个层,例如从后端到前端或从一个微服务到另一个微服务。DTO对象通常只包含必要的属性,而且它们通常与后端的数据模型完全一致.
- 查询多个文章:总体思路就是用户私聊查询多篇关于某个话题的文章,然后返回一个链接给用户,用户点开之后是一个H5页面,展示文章的信息。难点在于怎么把链接和文章信息对应起来,怎么不返回重复的文章。采用了redis缓存技术,首先用户发消息调用对应的funtion走到查询文章的函数中,使用向量数据库查出最匹配的多条数据,与用户的历史数据做对比,没在历史数据中的加入到一个列表中去,历史数据也是用redis实现的,最多存储100条,每次存入的时候删除100条之后的数据即可。得到列表后,存入redis中,key是用户的唯一标识+时间戳信息,给用户返回链接时带上这个key并且做一个AES加密处理,防止暴露用户的信息。用户点击之后,解密拿到key查询redis展示文章内容。
- urlencode:前面的newsapp/这些才有效,后面的只看成一个参数,所以需要编码。
- Lambda表达式:Lambda表达式通常与函数式接口(Functional Interface)一起使用。函数式接口是一个只包含一个抽象方法的接口。其实Lambda表达式就是对实现函数式接口的一种简写方式,实现了匿名内部类(原本我们需要创建子类或者实现类,去继承父类和实现接口,才能重写其中的方法。但是有时候我们这样做了,然而子类和实现类却只使用了一次(定义了一个对象)。这个时候我们就可以使用匿名内部类,不用去写子类和实现类,起到简化代码的作用)。