[]
        
立即试用
(Showing Draft Content)

AI 助手

GcExcel Java 提供了人工智能功能和模型请求处理程序,使您能够将用户提示和数据发送到指定的大语言模型,将模型返回的结果写入目标单元格,并将复杂的人工智能处理工作流程无缝集成到计算链中。借助人工智能功能,您可以在电子表格中轻松实现文本查询、数据分析、文本生成、文本翻译和文本情感分析。

前提条件

在使用人工智能助手之前,请确保您已从 OpenAI 或其他人工智能服务提供商处获取有效的 API 密钥。

模型请求处理程序

GcExcel Java 提供了 IAIModelRequestHandler 接口,帮助用户实现与人工智能模型完整的自定义交互流程。

sendRequestAsync 方法用于提交人工智能请求并返回异步结果。您可以参考人工智能功能的示例代码,也可根据需要自行实现此方法,以管理请求的生命周期,包括构建请求、发送请求、处理响应和错误。您还可以管理访问凭证、模型选择和参数配置;确保调用安全(如凭证保护、加密传输等);根据需要集成中间件(如敏感词过滤和日志审计);设置重试和超时等策略,以提高调用的安全性和稳定性。

在使用模型请求处理程序时,GcExcel Java 不会干预通过 IAIModelRequestHandler 发起的模型请求工作流程,也不会存储您的 API 密钥或任何请求/响应数据。

/**
 * 针对 OpenAI API 的 IAIModelRequestHandler 实现。
 */
public class OpenAIModelRequestHandler implements IAIModelRequestHandler {
    private String _apiEndpoint;
    private String _apiKey;
    private String _model;
    public OpenAIModelRequestHandler(String apiEndpoint, String apiKey, String model) {
        if (apiEndpoint == null || apiEndpoint.trim().isEmpty())
            throw new IllegalArgumentException("API 端点不能为空。");
        if (apiKey == null || apiKey.trim().isEmpty())
            throw new IllegalArgumentException("API 密钥不能为空。");
        _apiEndpoint = apiEndpoint.replaceAll("/$", "");
        _apiKey = apiKey;
        _model = model;
    }
    @Override
    public CompletableFuture<AIModelResponse> sendRequestAsync(AIModelRequest request) {
        CompletableFuture<AIModelResponse> result = new CompletableFuture<>();
        if (request == null) {
            AIModelResponse modelResponse = new AIModelResponse();
            modelResponse.setSuccess(false);
            System.err.println("请求不能为空。");
            result.complete(modelResponse);
            return result;
        }
        OpenAIClientAsync openAIClient = OpenAIOkHttpClientAsync.builder()
               .apiKey(_apiKey)
               .baseUrl(_apiEndpoint)
               .build();
        ChatCompletionCreateParams.Builder builder = ChatCompletionCreateParams.builder();
        for (AIMessage item : request.getMessages()) {
            switch (item.getRole().toLowerCase()) {
                case "system":
                    builder.addSystemMessage(item.getContent());
                    break;
                case "user":
                    builder.addUserMessage(item.getContent());
                    break;
                default:
                    throw new RuntimeException("未知的消息角色: " + item.getRole());
            }
        }
        builder.model(_model);
        ChatCompletionCreateParams params = builder.build();
        CompletableFuture<ChatCompletion> chatCompletion = openAIClient.chat().completions().create(params);
        chatCompletion.whenComplete((response, exception) -> {
            try {
                if (exception != null) {
                    AIModelResponse errorResponse = new AIModelResponse();
                    errorResponse.setSuccess(false);
                    System.err.println("发生错误: " + exception.getMessage());
                    result.complete(errorResponse);
                } else {
                    if (response != null &&!response.choices().isEmpty()) {
                        StringBuilder contentBuilder = new StringBuilder();
                        for (ChatCompletion.Choice choice : response.choices()) {
                            choice.message();
                            if (choice.message().content().isPresent()) {
                                contentBuilder.append(choice.message().content().get());
                            }
                        }
                        AIModelResponse successResponse = new AIModelResponse();
                        successResponse.setSuccess(true);
                        successResponse.setContent(contentBuilder.toString());
                        result.complete(successResponse);
                    } else {
                        AIModelResponse noContentResponse = new AIModelResponse();
                        noContentResponse.setSuccess(false);
                        System.err.println("未从模型收到内容。");
                        result.complete(noContentResponse);
                    }
                }
            } finally {
                try {
                    openAIClient.close();
                } catch (Exception e) {
                    System.err.println("关闭 OpenAI 客户端时出错: " + e.getMessage());
                }
            }
        });
        return result;
    }
}

错误类型

当人工智能功能返回以下错误值时,请参考此表排查可能的原因。

错误值

描述

#VALUE!

此错误由无效的输入参数或内部错误导致,从而致使函数执行失败。

#BUSY!

此错误表示函数正在异步计算,结果尚未得出。

#CONNECT!

IAIModelRequestHandler 返回错误响应或发生网络连接故障时,会出现此错误。

#NA!

此错误表明未注册 Workbook.AIModelRequestHandler

安全最佳实践

数据保护

  • 始终清理敏感的电子表格数据并对其去标识化。

  • 对于请求返回的结果,确保对敏感字段进行去标识化处理。

验证

  • 验证所有由人工智能生成的内容。

  • 对输出结果进行安全检查。

类型=警告

人工智能生成内容免责声明

  1. 内容生成风险

    本服务利用用户接入的第三方人工智能模型生成输出内容。由于模型架构和训练数据存在固有局限性,结果可能包含不准确、遗漏或误导性内容。尽管我们实施了 “提示工程” 并设置技术限制来优化输出,但我们无法消除因模型根本缺陷产生的所有错误风险。

  2. 用户验证义务

    通过使用本服务,您知悉并同意:

    • 对所有生成的内容进行人工验证。

    • 避免在高风险场景(法律、医疗、金融等)中使用未经验证的输出内容。

    • 若因依赖生成的内容而导致任何直接/间接损害,我们不承担责任。

  3. 技术限制

    我们对以下情况不承担责任:

    • 由第三方模型缺陷或逻辑错误导致的输出失败。

    • 通过容错程序进行错误恢复尝试未成功。

    • 当前人工智能技术固有的技术限制。

  4. 知识产权合规

    您必须确保:

    • 接入的模型/内容不侵犯第三方权利。

    • 不通过本服务处理非法/敏感材料。

    • 遵守模型提供商的知识产权协议。

  5. 协议更新

    我们保留修改这些条款的权利,以适应:

    • 技术进步(例如新的人工智能安全协议)。

    • 法规变化(例如更新的人工智能治理框架)。

    • 服务架构改进。

局限性

由于人工智能模型具有不确定性,相同的公式在重新计算时可能会产生不同的结果。