1.获取mistral模型的api-key和base-url
2.yaml
spring:
ai:
mistralai:
chat:
base-url: http://localhost:11434
options:
model: mistral
api-key: sk-50c1070552f249d8ad3c261b7bb3b369
3.Controller
@GetMapping(value = "/chat/stream/function", produces = "text/html;charset=UTF-8")
public Flux<String> chatStreamWithFunction() {
String prompt = "/Joker/a/1.md,通过解析这个文档,这个文档中开发规范有哪些?";
MistralAiChatOptions builder = MistralAiChatOptions.builder().withFunction("documentAnalyzerFunction").build();
String content = model.call(new Prompt(prompt, builder)).getResult().getOutput().getContent();
System.out.println(content);
return null;
}
4.Function
/**
* 通过@Description描述函数的用途,这样ai在多个函数中可以根据描述进行选择。
*/
@Description("文档解析函数")
@Service
@Slf4j
public class DocumentAnalyzerFunction implements Function<DocumentAnalyzerFunction.Request, DocumentAnalyzerFunction.Response> {
/**
* 通过@JsonProperty声明属性名称和是否必填
* 通过@JsonPropertyDescription描述属性的用途,这样ai可以提取出符合参数描述的内容。
*/
@Data
public static class Request {
@JsonProperty(required = true, value = "path")
@JsonPropertyDescription(value = "解析文档路径")
String path;
}
public record Response(String result) {
}
@SneakyThrows
@Override
public Response apply(Request request) {
// ai解析用户的提问得到path参数,使用tika读取本地文件获取内容。把读取到的内容再返回给ai作为上下文去回答用户的问题。
TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new FileSystemResource(request.path));
return new Response(tikaDocumentReader.read().get(0).getContent());
}
}
5.由于此模型是我本地部署的7b大小的模型,所以不怎么智能,调取多次才有概率分析到我本地的文件,而且还不怎么正确
6.效果:
7.总结:
代码没有问题,主要是看调用的模型,支持的模型可以通过SpringAi官网中查看