为了为所有AI模型客户提供一个基础,创建了通用模型API。这通过遵循一种常见模式,使得向Spring AI贡献新的AI模型支持变得简单。以下部分将指导你了解这个API。

类图

spring ai generic model api

模型客户端

ModelClient接口提供了一个通用的API用于调用AI模型。它旨在通过抽象发送请求和接收响应的过程来处理与各种类型的AI模型的交互。该接口使用Java泛型来适应不同类型的请求和响应,增强了在不同AI模型实现之间的灵活性和适应性。

接口定义如下:

public interface ModelClient<TReq extends ModelRequest<?>, TRes extends ModelResponse<?>> {

/**
	 * 执行对AI模型的方法调用。
	 * @param request 发送给AI模型的请求对象
	 * @return 来自AI模型的响应
	 */
	TRes call(TReq request);

}

流式模型客户端

StreamingModelClient接口提供了一个用于调用具有流式响应的AI模型的通用API。它抽象了发送请求和接收流式响应的过程。该接口使用Java泛型来适配不同类型的请求和响应,增强了在不同AI模型实现之间的灵活性和适应性。

public interface StreamingModelClient<TReq extends ModelRequest<?>, TResChunk extends ModelResponse<?>> {

/**
	 * 执行对AI模型的方法调用。
	 * @param request 发送给AI模型的请求对象
	 * @return 来自AI模型的流式响应
	 */
	Flux<TResChunk> stream(TReq request);

}

模型请求

接口代表了对人工智能模型的请求。这个接口封装了与AI模型交互所需的必要信息,包括指令或输入(通用类型T)以及额外的模型选项。它提供了一种标准化的方法来向AI模型发送请求,确保包含所有必要的细节,并且可以轻松管理。

public interface ModelRequest<T> {

/**
	 * Retrieves the instructions or input required by the AI model.
	 * @return the instructions or input required by the AI model
	 */
	T getInstructions(); // required input

/**
 * 检索用于AI模型交互的可定制选项。
 * @return AI模型交互的可定制选项
 */
ModelOptions getOptions();

}

模型选项

接口表示AI模型交互的可定制选项。这个标记接口允许指定各种设置和参数,这些设置和参数可以影响AI模型的行为和输出。它旨在提供灵活性和适应性,在不同的AI场景中,确保AI模型可以根据具体要求进行微调。

public interface ModelOptions {

}

模型响应

接口代表从AI模型接收到的响应。该接口提供了访问AI模型生成的主要结果或结果列表的方法,以及响应元数据。它作为一种标准化方式,封装并管理AI模型的输出,确保生成的信息能够被轻松检索和处理。

public interface ModelResponse<T extends ModelResult<?>> {

/**
 * 获取AI模型的结果。
 * @return AI模型生成的结果
 */
T getResult();

/**
	 * Retrieves the list of generated outputs by the AI model.
	 * @return the list of generated outputs
	 */
	List<T> getResults();

/**
	 * 获取与AI模型响应相关联的响应元数据。
	 * @return 响应元数据
	 */
	ResponseMetadata getMetadata();

}

模型结果

这个接口提供了方法来访问AI模型的主输出以及与这个结果相关联的元数据。它旨在提供一个标准化和全面的方法来处理和解释由AI模型生成的输出。

public interface ModelResult<T> {

/**
	 * 获取AI模型生成的输出。
	 * @return AI模型生成的输出
	 */
	T getOutput();

/**
	 * 检索与AI模型结果相关联的元数据。
	 * @return 与结果相关联的元数据
	 */
	ResultMetadata getMetadata();

}