【AI】文档理解
引子
我们除了通过提示词来告诉AI我们的需求外,也可以通过上传文档的方式让它去理解里面的内容然后对我们的需求做出特定的回应,这就需要用到文档理解的功能了!
1. 模型引入
目前使用阿里云百炼平台的话,当前仅qwen-long
模型支持对文档进行分析(官网链接:大模型服务平台百炼控制台)
支持的文件格式也很多,如下:
引入依赖
此处需要使用OpenAI兼容接口上传文档,要先安装OpenAI SDK,对此需要引入相关依赖:
<!--辅助开启qwen-long文档理解-->
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>0.32.0</version>
</dependency>
2. 问题先知
目前qwen-long只支持使用OpenAI SDK来进行文档上传返回file id,使用官方的方法会有些问题,Path只能获取本地路径,如果需要我们上传文件来进行访问的话,光靠获取本地路径是不够的;
在创建file时需要传入以下几种类型的参数:
在尝试:
- 访问的不是本地路径,即不使用Path
- multipartFile.getBytes()
- multipartFile.getInputStream()
都会报以下错误:
om.openai.errors.BadRequestException: 400: OpenAIError{additionalProperties={error={message=Invalid part type., type=invalid_request_error, param=null, code=null}}}
有一种解决方法,创建一个临时文件:
private FileObject getFileObject(MultipartFile multipartFile, OpenAIClient client) throws IOException {
FileObject fileObject;
String originalFilename = multipartFile.getOriginalFilename();
if (originalFilename == null || originalFilename.isEmpty()) {
originalFilename = "upload.txt";
}
// 写入临时文件
Path tempFile = Files.createTempFile("openai-", "-" + originalFilename);
multipartFile.transferTo(tempFile.toFile());
try {
// 直接传 Path,OpenAI SDK 会自动构造 InputStream + filename
FileCreateParams fileParams = FileCreateParams.builder()
.file(tempFile)
.purpose(FilePurpose.of("file-extract"))
.build();
fileObject = client.files().create(fileParams);
} finally {
Files.deleteIfExists(tempFile); // 清理
}
return fileObject;
}
使用这种方式就访问成功了!!
注:purpose(FilePurpose.of(“file-extract”)),在翻openai官网时使用purpose(FilePurpose.FINE_TUNE)却失败了
3. 代码编写
3.1 方法封装
结合上述问题封装后的文件上传解决方法,对qwen-long模型进行调用,封装成方法如下:
@Override
public String documentReasonChat(MultipartFile multipartFile, String memoryId, String message) throws IOException {
OpenAIClient client = OpenAIOkHttpClient.builder()
.apiKey(System.getenv("DASH_SCOPE_API_KEY"))
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
// 构建临时文件
FileObject fileObject = getFileObject(multipartFile, client);
String fileId = fileObject.id();
// 创建聊天请求
ChatCompletionCreateParams chatParams = ChatCompletionCreateParams.builder()
.addSystemMessage("fileid://" + fileId)
.addUserMessage(message)
.model("qwen-long")
.build();
// 发送请求并获取响应
ChatCompletion chatCompletion = client.chat().completions().create(chatParams);
String newContent = chatCompletion.choices().get(0).message().content().get();
System.out.println(newContent);
// 存入mongo
try {
mongoChatMemoryStore.appendContentToMemory(memoryId, message, newContent);
}
catch (RuntimeException e) {
throw new RuntimeException(e);
}
// 打印响应结果
return newContent;
}
3.2 接口构建
构建接口如下:
/**
* 文档理解
*/
@PostMapping("/documentReason")
public String documentReason(@RequestParam("file") MultipartFile multipartFile, String memoryId, String message) throws IOException {
String chatResponse = chatService.documentReasonChat(multipartFile, memoryId, message);
return chatResponse;
}
注:业务层chatService调用请自行编写引入,或者直接引入方法到接口层
上传的文档内容大概如下:
执行结果如下:
到这里在ai中引入文档理解功能的步骤就完成了~
以上便是对文档理解的介绍与使用了,如果上述内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧✨