使用大模型调用外部工具
这里需要先介绍一下Function calling,什么是Function calling? 它提供了可以让我们把大模型和外部数据或系统进行连接的能力 举个具体的例子:我们现在有一些如查询订单等信息的接口,我们可以把这些接口工具及参数等详情信息提供给大模型,这样如果在上下文对话中,它判断出需要需要使用这个接口时,就会返回对应的接口及参数值**(注意:大模型只是会判断后返回工具名称和参数,并不会实际进行调用)** 我们可以据此在本地进行实际的调用,获取最终结果进行返回;如果大模型函数不需要这个能力,那么就可以以正常自然语言的方式进行对话内容返回 当然,我们也可以通过设置一些参数,强制大模型使用/不使用工具 这个Function calling能力,各个大模型提供的api可能有所差异,需要看各自对应的API,但是langchain帮我们整合了相关的功能,所以本次我们主要看一下通过它来实现 使用python 3.10.9 langchain0.3,以及百度千帆模型 环境准备 12345678# 创建虚拟环境$ python3 -m venv .venv# 激活虚拟环境$ s...
如何让大模型返回结构化的数据
大模型中一般可以用来进行对话等,但是有一些场景我们可能要基于大模型的返回结果进行一些后续代码的处理,比如进行一些判断,返回结果为是/否,或者生成一些数据我们直接使用,这种情况下我们就需要大模型返回的结构是固定的,这样代码才能够进行解析使用 本篇根据langchain官方文档,简单介绍一下如何使用langchain来让大模型返回结构化数据的几种方式 使用python 3.10.9 langchain0.3,以及百度千帆模型 环境准备 12345678# 创建虚拟环境$ python3 -m venv .venv# 激活虚拟环境$ source .venv/bin/activate# 安装依赖$ pip install langchain$ pip install langchain-community$ pip install qianfan 普通调用方式 先简单看一下普通的对话调用方式 12345678model = QianfanChatEndpoint(model="ERNIE-3.5-8K")messages = [ # 设置消息类型及...
OkHttp拦截器的使用及原理分析
OkHttp作为一个HTTP客户端,拦截器是其强大的功能之一,它允许用户在请求和响应的声明周期中拦截并修改它们,利用拦截器,我们可以很方便的实现如日志记录、请求加密/签名、响应解密、异常重试等功能。本文将详细介绍一下拦截器的使用方法及其原理 如何使用拦截器 首先我们先来看下拦截器使用的具体场景感受一下 监控打点拦截器 在服务端掉用外部系统的接口,我们一般需要统计一下成功率,TP99等信息,假设我们使用 cat 来支持此监控功能,那么我们就可以定义一个拦截器进行统计上报 123456789101112131415161718192021public class CatInterceptor implements Interceptor { @NotNull @Override public Response intercept(@NotNull Chain chain) throws IOException { final Request request = chain.request(); Transaction...
RestTemplate使用快速入门
现在对于调用外部http接口的包已经有很多了,比如 Java 原生的 HttpURLConnection,Apache的 HttpClient,Spring的 RestTemplate 以及 WebClient ,Square 的 OkHttp 以及Netflix 的 Feign,从简单到高级功能可以说是应有尽有 不过对于内部都是RPC进行交互的服务,只有一些简单的场景需要调用 HTTP 接口,考虑项目如果为为spring的项目,可以考虑直接使用 RestTemplate 这里以之前写的费用分摊系统为例,展示一下使用 GET 和 POST 请求的方式 GET方法 首先看下GET请求的查询项目列表接口,先看一下接口 现在开始写编写代码,首先根据返回结构定义好返回类型信息 12345678910111213141516171819202122232425262728// 响应类@Datapublic class Resp<T> { private Integer status; private String errCode; private...
Spring通过@Value注入外部配置值
在spring项目中我们可以通过@Value注解使用配置文件中的值,但是有时候我们想注入外部系统(如配置中心)中配置的值,这时候可以通过读取配置中心的值并作为PropertySource注入到Spring的 Environment中来实现 先定义一个实现ApplicationContextInitializer接口的类,用于读取配置并添加到Environment中 1234567891011121314151617181920public class DynamicConfigInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { final ConfigurableEnvironment environment = applica...
常用正则表达式
正则表达式是一种强大的文本匹配工具,通过特定的语法规则,可以实现对字符串的灵活匹配。在本文中,我们将介绍一系列常用的正则表达式,覆盖了匹配任意字符、多个字符包含匹配、排除字符包含匹配、重复匹配、单词边界匹配、字符串边界、子表达式(分组)、回溯引用以及前后查找等内容 匹配任意字符 使用.通配符可以匹配任意的字符(单个字符) 例如,a.b可以匹配到"acb"、“aab”、"a1b"等字符串。 多个字符包含匹配 通过使用[]将允许匹配的字符穷举在括号中,如[abc123]可以匹配a、b、c、1、2、3中的任意一个字符 一些常用的范围可以直接使用范围匹配,如[a-zA-Z1-9]等 排除字符包含匹配 在上述括号中开头添加^即可匹配除括号中字符的其他字符,如[^abc123]可以匹配除a、b、c、1、2、3中的其他任意一个字符 重复匹配 匹配最少n个: {n,} 匹配精确的n个: {n} 匹配最少n个,最多m个: {n, m} 匹配最少一个: + 匹配0个或1个: ? 匹配0个或多个: ...
Maven Profiles简介
虽然maven的目标是使项目构建是可移植的,尽量使在任何机器下都可以构建且结果相同,但是仍然会有一些情况需要我们根据环境等信息来构建不同的内容,这时候就需要用到 maven profiles Profiles配置激活 profiles可以在全局配置的setting.xml中配置,也可以在项目的pom.xml中进行配置,这里我们主要看下在项目中进行配置 1234567891011121314151617181920212223242526272829303132333435363738394041424344<profiles> <!-- 定义一个profile --> <profile> <!-- 定义profile的ID,也就是唯一的名称 --> <id>dev</id> <!-- 这里可以配置激活此profile的配置,多个条件时需要同时满足 --> <activation> <!--...
DI框架-Guice入门
在使用Spring框架时,我们应该已经非常熟悉依赖注入这一概念,它可以帮我们节省构建类及设置相应依赖类的成本,只需要声明自己需要哪些类/接口即可使用,同时还可以更好的支持单元测试 这次我们看一下另一款依赖注入的框架guice,下面介绍的内容也都是来自官方文档 首先需要引入包 12345<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>7.0.0</version></dependency> 首先需要定义好相关的接口和实现类,如果有外部依赖的类,可以使用构造器注入,添加上@Inject注解 123456789101112131415161718192021222324public class RealBillingService implements BillingService { private final Credit...
Elasticsearch 入门:写给 SQL 开发者的实战指南
假设你在做一个电商后台,商品表 products 有 100 万行。产品经理说:「用户搜『无线鼠标』,要把名字、描述里包含这些词的商品都找出来,按相关性排序。」 你写下 MySQL: 1234-- 慢,而且语义粗糙SELECT * FROM productsWHERE name LIKE '%无线%' OR name LIKE '%鼠标%' OR description LIKE '%无线%' OR description LIKE '%鼠标%'; 三个问题立刻冒出来: 慢:LIKE '%...%' 走不了 B+Tree 索引,100 万行全表扫描。 不准:「无线鼠标垫」也会被匹配——它并不真的是鼠标。 排不出相关性:哪个排前面?MySQL 给不了你打分。 这就是 Elasticsearch(下称 ES)诞生的场景。它是一个分布式的全文搜索与分析引擎,核心能力是把文档按「词」组织起来(倒排索引),让「找出包含某些词的文档、并按相关性排序」这件事变得快且智能。 本文面向有 SQL 基础、但没接触...
协程之Kotlin
一般我们在 Java 项目中做并发编程,基本都是通过创建线程的方式来执行(JDK21支持了虚拟线程),但是线程有如下问题 线程是不能无限创建的,而是受到操作系统的限制 线程切换的时候有较高的上下文切换的成本 而协程可以理解为轻量级的线程,可以在一个线程中执行多个任务,而不需要线程切换的开销,同时也避免了线程数量的限制 这里看一下kotlin中的协程,首先需要引入单独的依赖包 1234// gradle.ktsdependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0-RC2")} 如果需要在主线程中异步执行一些任务,但是主线程要同步等待异步任务结果,可以使用runBlocking(结构化并发) 无需结果的任务执行 对于不需要获取结果的任务,可以使用如下形式: 12345678// 1. 主线程逻辑runBlocking { // 协程中执行任务1 launch { /*任务1逻辑*/ ...
