Files
Agents-Flex1/docs/zh/core/llms.md
2025-08-27 19:57:20 +08:00

284 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LLMs 大语言模型
Agents-Flex 提供了关于大语言模型的抽象实现接口 `Llm.java`,它支持 `chat` 以及 `chatStream` 两种不同的对话方式。
针对不同的厂商Agents-Flex 提供了不同的实现类以及通信协议,其中通信协议包括了 `HTTP``SSE` 以及 `WebSocket` 等客户端。
## 大模型支持
目前Agents-Flex 已支持以下的大语言模型:
- OpenAIChatGPT以及所有的兼容 OpenAI 接口的大模型)
- ChatGLM智普大模型
- Coze (调用 Coze 的智能体)
- DeepSeek
- Gitee AI
- Moonshot月之暗面
- Ollama通过 Ollama 部署的所有大模型)
- Qianfan百度千帆部署的大模型
- Qwen千问大模型阿里云百炼平台部署的大模型
- Spark星火大模型
## 简单对话
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
// 设置你的 OpenAI API Key
config.setApiKey("sk-rts5NF6n*******");
Llm llm = new OpenAILlm(config);
String response = llm.chat("请问你叫什么名字");
System.out.println(response);
}
```
## 流式对话
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
// 设置你的 OpenAI API Key
config.setApiKey("sk-rts5NF6n*******");
Llm llm = new OpenAILlm(config);
llm.chatStream("你叫什么名字", new StreamResponseListener() {
@Override
public void onMessage(ChatContext context, AiMessageResponse response) {
System.out.println(response.getMessage().getContent());
}
});
}
```
## 流式对话之停止对话
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
// 设置你的 OpenAI API Key
config.setApiKey("sk-rts5NF6n*******");
Llm llm = new OpenAILlm(config);
llm.chatStream("你叫什么名字", new StreamResponseListener() {
@Override
public void onMessage(ChatContext context, AiMessageResponse response) {
System.out.println(response.getMessage().getContent());
//停止对话
context.getClient().stop();
}
});
}
```
## 流式对话之更多的监听
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
// 设置你的 OpenAI API Key
config.setApiKey("sk-rts5NF6n*******");
Llm llm = new OpenAILlm(config);
llm.chatStream("你叫什么名字", new StreamResponseListener() {
@Override
public void onMessage(ChatContext context, AiMessageResponse response) {
AiMessage message = response.getMessage();
System.out.println(message.getContent());
}
@Override
public void onStart(ChatContext context) {
System.out.println("开始");
}
@Override
public void onStop(ChatContext context) {
System.out.println("结束");
}
@Override
public void onFailure(ChatContext context, Throwable throwable) {
System.out.println("错误");
}
});
}
```
## 图片识别对话
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
// 设置你的 OpenAI API Key
config.setApiKey("sk-5gqOcl*****");
config.setModel("gpt-4-turbo");
Llm llm = new OpenAILlm(config);
ImagePrompt prompt = new ImagePrompt("What's in this image?");
prompt.setImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg");
//或者 prompt.setImageFile(new File("/your-image-path.png"))
//或者 prompt.setImageStream(imageInputStream)
//或者 prompt.setImageBase64("image base64 data....")
AiMessageResponse response = llm.chat(prompt);
System.out.println(response);
}
```
## 方法调用Function Calling
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
OpenAILlm llm = new OpenAILlm(config);
FunctionPrompt prompt = new FunctionPrompt("今天北京的天气怎么样", WeatherFunctions.class);
AiMessageResponse response = llm.chat(prompt);
System.out.println(response.callFunctions());
// "Today it will be dull and overcast in 北京"
}
```
`WeatherFunctions.class` 代码如下:
```java
public class WeatherFunctions {
@FunctionDef(name = "get_the_weather_info", description = "get the weather info")
public static String getWeatherInfo( @FunctionParam(name = "city", description = "the city name") String name) {
return "Today it will be dull and overcast in " + name;
}
}
```
## 历史对话
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
OpenAILlm llm = new OpenAILlm(config);
//第一步:创建一个 HistoriesPrompt
HistoriesPrompt prompt = new HistoriesPrompt();
System.out.println("您想问什么?");
Scanner scanner = new Scanner(System.in);
String userInput = scanner.nextLine();
while (userInput != null) {
// 第二步:将用户输入添加到 HistoriesPrompt 中
prompt.addMessage(new HumanMessage(userInput));
// 第三步:调用 chatStream 方法,进行对话
llm.chatStream(prompt, (context, response) -> {
System.out.println(">>>> " + response.getMessage().getContent());
});
userInput = scanner.nextLine();
}
}
```
关于 HistoriesPrompt 更多的配置:
```java
HistoriesPrompt prompt = new HistoriesPrompt();
//设置系统消息
prompt.setSystemMessage(new SystemMessage('你是一个数据库开发工程师....'));
//设置最大历史消息数量
prompt.setMaxAttachedMessageCount(10);
//设置是否开启历史消息截断
prompt.setHistoryMessageTruncateEnable(true);
//设置历史消息截断长度
prompt.setHistoryMessageTruncateLength(1000);
//自定义历史消息截断处理器
prompt.setHistoryMessageTruncateProcessor(...);
//设置历史消息存储器
prompt.setMemory(...);
```
## 历史对话 + 方法调用
```java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
OpenAILlm llm = new OpenAILlm(config);
//第一步:创建一个 HistoriesPrompt
HistoriesPrompt prompt = new HistoriesPrompt();
System.out.println("您想问什么?");
Scanner scanner = new Scanner(System.in);
String userInput = scanner.nextLine();
while (userInput != null) {
// 第二步:创建 HumanMessage并添加方法调用
HumanMessage humanMessage = new HumanMessage(userInput);
humanMessage.addFunctions(WeatherFunctions.class);
// 第三步:将 HumanMessage 添加到 HistoriesPrompt 中
prompt.addMessage(humanMessage);
// 第四步:调用 chatStream 方法,进行对话
llm.chatStream(prompt, new StreamResponseListener() {
@Override
public void onMessage(ChatContext context, AiMessageResponse response) {
boolean functionCall = response.isFunctionCall();
if (functionCall) {
System.out.println("do func >>> ");
StringBuilder text = new StringBuilder("调用工具结果如下:\n");
List<FunctionCaller> callers = response.getFunctionCallers();
for (FunctionCaller caller : callers) {
String name = caller.getFunction().getName();
Object callRes = caller.call();
text.append("调用[").append(name).append("]的结果为:").append(callRes).append("\n");
}
HumanMessage msg = new HumanMessage(text.toString());
prompt.addMessage(msg);
llm.chatStream(prompt, new StreamResponseListener() {
@Override
public void onMessage(ChatContext context, AiMessageResponse response) {
System.out.println("after func >>>> " + response.getMessage().getContent());
}
});
} else {
System.out.println("normal >>>> " + response.getMessage().getContent());
}
}
});
userInput = scanner.nextLine();
}
}
```