聊天模型是 FEL 的核心组件,其使用聊天消息作为输入,并返回聊天消息作为输出。为方便集成不同模型提供商(OpenAI、Qwen 等)提供的模型服务,FEL 抽象了一个标准接口来进行交互。
public interface ChatModel {
/**
* 调用聊天模型生成结果。
*
* @param prompt 表示提示词的 {@link Prompt}。
* @param chatOption 表示聊天模型参数的 {@link ChatOption}。
* @return 表示聊天模型生成结果的 {@link Choir}{@code <}{@link ChatMessage}{@code >}。
*/
Choir<ChatMessage> generate(Prompt prompt, ChatOption chatOption);
}聊天模型接收提示词以及一个可选参数,返回一个聊天消息流,根据可选参数中 stream 的值,返回一个或多个聊天消息。
- 在项目 pom.xml 加入以下依赖:
<dependencies>
<dependency>
<groupId>org.fitframework</groupId>
<artifactId>fit-starter</artifactId>
<version>${fit.version}</version>
</dependency>
<dependency>
<groupId>org.fitframework</groupId>
<artifactId>fit-plugins-starter-web</artifactId>
<version>${fit.version}</version>
</dependency>
<dependency>
<groupId>org.fitframework.plugin</groupId>
<artifactId>fit-http-client-okhttp</artifactId>
<version>${fit.version}</version>
</dependency>
<dependency>
<groupId>org.fitframework.fel</groupId>
<artifactId>fel-core</artifactId>
<version>${fel.version}</version>
</dependency>
<dependency>
<groupId>org.fitframework.fel</groupId>
<artifactId>fel-model-openai-plugin</artifactId>
<version>${fel.version}</version>
</dependency>
</dependencies>- 在 application.yml 配置文件中加入以下配置:
fel:
openai:
api-base: '${api-base}'
api-key: '${your-api-key}'
example:
model: '${model-name}'- 添加如下代码:
@Component
public class ChatModelExampleController {
private final ChatModel chatModel;
@Value("${example.model}")
private String modelName;
public ChatModelExampleController(ChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/chat")
public ChatMessage chat(@RequestParam("query") String query) {
ChatOption option = ChatOption.custom().model(this.modelName).stream(false).build();
return this.chatModel.generate(ChatMessages.from(new HumanMessage(query)), option).blockAll().get(0);
}
}- 让模型返回流式输出:
@GetMapping("/chat-stream")
public Choir<ChatMessage> chatStream(@RequestParam("query") String query) {
ChatOption option = ChatOption.custom().model(this.modelName).stream(true).build();
return this.chatModel.generate(ChatMessages.from(new HumanMessage(query)), option);
}至此,完成了聊天模型的接入,返回 Choir 对象,FIT 框架将自动使用 SSE 格式返回流式输出。
-
在浏览器栏输入:
http://localhost:8080/ai/example/chat?query=告诉我一个笑话返回如下响应:
{
"content": "当然,接下来我将告诉你一个笑话:\n\n为什么袜子总是只丢一只?因为丢两只根本就不会发现。 \n\n希望这能给你带来一些欢笑!如果你还需要其他的笑话或者其他帮助,随时告诉我。",
"toolCalls": []
}-
在浏览器栏输入:
http://localhost:8080/ai/example/chat-stream?query=告诉我一个笑话返回如下响应:
data:{"content":"","toolCalls":[]}
data:{"content":"当然","toolCalls":[]}
data:{"content":",","toolCalls":[]}
data:{"content":"接下来","toolCalls":[]}
data:{"content":"是一个","toolCalls":[]}
data:{"content":"轻松","toolCalls":[]}
data:{"content":"的","toolCalls":[]}
data:{"content":"笑话","toolCalls":[]}
data:{"content":":\n\n","toolCalls":[]}
data:{"content":"为什么","toolCalls":[]}
data:{"content":"袜","toolCalls":[]}
...