0%

这里需要先介绍一下Function calling,什么是Function calling? 它提供了可以让我们把大模型和外部数据或系统进行连接的能力

举个具体的例子:我们现在有一些如查询订单等信息的接口,我们可以把这些接口工具及参数等详情信息提供给大模型,这样如果在上下文对话中,它判断出需要需要使用这个接口时,就会返回对应的接口及参数值**(注意:大模型只是会判断后返回工具名称和参数,并不会实际进行调用)**

我们可以据此在本地进行实际的调用,获取最终结果进行返回;如果大模型函数不需要这个能力,那么就可以以正常自然语言的方式进行对话内容返回

当然,我们也可以通过设置一些参数,强制大模型使用/不使用工具

这个Function calling能力,各个大模型提供的api可能有所差异,需要看各自对应的API,但是langchain帮我们整合了相关的功能,所以本次我们主要看一下通过它来实现

阅读全文 »

大模型中一般可以用来进行对话等,但是有一些场景我们可能要基于大模型的返回结果进行一些后续代码的处理,比如进行一些判断,返回结果为是/否,或者生成一些数据我们直接使用,这种情况下我们就需要大模型返回的结构是固定的,这样代码才能够进行解析使用

本篇根据langchain官方文档,简单介绍一下如何使用langchain来让大模型返回结构化数据的几种方式

使用python 3.10.9 langchain0.3,以及百度千帆模型

阅读全文 »

OkHttp作为一个HTTP客户端,拦截器是其强大的功能之一,它允许用户在请求和响应的声明周期中拦截并修改它们,利用拦截器,我们可以很方便的实现如日志记录、请求加密/签名、响应解密、异常重试等功能。本文将详细介绍一下拦截器的使用方法及其原理

阅读全文 »

现在对于调用外部http接口的包已经有很多了,比如 Java 原生的 HttpURLConnection,Apache的 HttpClient,Spring的 RestTemplate 以及 WebClient ,Square 的 OkHttp 以及Netflix 的 Feign,从简单到高级功能可以说是应有尽有

不过对于内部都是RPC进行交互的服务,只有一些简单的场景需要调用 HTTP 接口,考虑项目如果为为spring的项目,可以考虑直接使用 RestTemplate

阅读全文 »

在spring项目中我们可以通过@Value注解使用配置文件中的值,但是有时候我们想注入外部系统(如配置中心)中配置的值,这时候可以通过读取配置中心的值并作为PropertySource注入到Spring的 Environment中来实现

阅读全文 »

正则表达式是一种强大的文本匹配工具,通过特定的语法规则,可以实现对字符串的灵活匹配。在本文中,我们将介绍一系列常用的正则表达式,覆盖了匹配任意字符、多个字符包含匹配、排除字符包含匹配、重复匹配、单词边界匹配、字符串边界、子表达式(分组)、回溯引用以及前后查找等内容

阅读全文 »

虽然maven的目标是使项目构建是可移植的,尽量使在任何机器下都可以构建且结果相同,但是仍然会有一些情况需要我们根据环境等信息来构建不同的内容,这时候就需要用到 maven profiles

阅读全文 »

在使用Spring框架时,我们应该已经非常熟悉依赖注入这一概念,它可以帮我们节省构建类及设置相应依赖类的成本,只需要声明自己需要哪些类/接口即可使用,同时还可以更好的支持单元测试

这次我们看一下另一款依赖注入的框架guice,下面介绍的内容也都是来自官方文档

阅读全文 »

假设你在做一个电商后台,商品表 products 有 100 万行。产品经理说:「用户搜『无线鼠标』,要把名字、描述里包含这些词的商品都找出来,按相关性排序。」

你写下 MySQL:

1
2
3
4
-- 慢,而且语义粗糙
SELECT * FROM products
WHERE name LIKE '%无线%' OR name LIKE '%鼠标%'
OR description LIKE '%无线%' OR description LIKE '%鼠标%';

三个问题立刻冒出来:

  • LIKE '%...%' 走不了 B+Tree 索引,100 万行全表扫描。
  • 不准:「无线鼠标垫」也会被匹配——它并不真的是鼠标。
  • 排不出相关性:哪个排前面?MySQL 给不了你打分。

这就是 Elasticsearch(下称 ES)诞生的场景。它是一个分布式的全文搜索与分析引擎,核心能力是把文档按「词」组织起来(倒排索引),让「找出包含某些词的文档、并按相关性排序」这件事变得快且智能。

本文面向有 SQL 基础、但没接触过 ES 的后端开发者,用一个贯穿全文的电商商品表 products,带你从心智模型一路跑到进阶查询。

阅读全文 »

一般我们在 Java 项目中做并发编程,基本都是通过创建线程的方式来执行(JDK21支持了虚拟线程),但是线程有如下问题

  • 线程是不能无限创建的,而是受到操作系统的限制
  • 线程切换的时候有较高的上下文切换的成本

而协程可以理解为轻量级的线程,可以在一个线程中执行多个任务,而不需要线程切换的开销,同时也避免了线程数量的限制

这里看一下kotlin中的协程,首先需要引入单独的依赖包

1
2
3
4
// gradle.kts
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0-RC2")
}
阅读全文 »