文心一言与FuncGPT两大AI编程利器的角力:谁能更精准处理BigDecimal?

简介: 8 月 31 日,以百度“文心一言”为代表的大模型产品首批通过《生成式人工智能服务管理暂行办法》备案,将通过Web、APP、API等方式,为全社会提供多种生成式AI服务。

8 月 31 日,以百度“文心一言”为代表的大模型产品首批通过《生成式人工智能服务管理暂行办法》备案,将通过Web、APP、API等方式,为全社会提供多种生成式AI服务。
因为文心一言是基于百度深度学习平台,可以自然地处理中文,提供中文编程环境,具有强大的自适应学习功能,能够自动生成符合语法规则的代码,辅助开发人员编程,所以自今年3月开启邀测就受到广大开发人员的关注。如今面向全社会开放无疑给开发人员提升工作效率提供了更多的可能性。

除了文心一言这样的大模型外,在代码生成垂直领域,个人还关注到一款叫做FuncGPT(慧函数)的产品。今天就来测试一下,一个背靠大厂光环;一个名不见经传,宣称专注AI生成Java函数,二者是否能够真的帮广大“码农”解燃眉之急。

我以编程中常常需要对浮点数进行精确的运算时会用到BigDecimal为例,分别在两个产品界面输入“写一个Java函数,实现bigDecimal表达式计算”。

文心一言生成的代码示例:
官网地址:https://yiyan.baidu.com

import java.math.BigDecimal;
import java.math.MathContext;

public class BigDecimalCalculator {

public static BigDecimal calculateExpression(String expression) throws Exception {
    // 将字符串表达式解析为BigDecimal对象数组
    BigDecimal[] operands = new BigDecimal[expression.split("\\+").length];
    int index = 0;
    for (String operand : expression.split("\\+")) {
        operands[index] = new BigDecimal(operand.trim());
        index++;
    }

    // 递归计算表达式
    return calculateExpressionRecursive(operands, index);
}

private static BigDecimal calculateExpressionRecursive(BigDecimal[] operands, int index) throws Exception {
    if (index == 0) {
        return operands[0];
    } else {
        BigDecimal currentOperand = operands[index - 1];
        BigDecimal subExpressionValue = calculateExpressionRecursive(operands, index - 1);
        return currentOperand.add(subExpressionValue);
    }
}

public static void main(String[] args) throws Exception {
    String expression = "3.1415926+2.7182818-1.5707963";
    BigDecimal result = calculateExpression(expression);
    System.out.println(result.toString()); // 输出结果为:4.279685799999999
}

}

FuncGPT(慧函数)生成的代码示例:
下载地址:https://suo.im/a2pXi
// 类名:BigDecimalCalculator
// 函数名:calculateExpression
// 函数功能:使用BigDecimal计算表达式的结果
// POM依赖包:
//
// org.apache.commons
// commons-lang3
// 3.12.0
//

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Stack;

public class BigDecimalCalculator {
/**

 * 使用BigDecimal计算表达式的结果
 * @param expression 要计算的表达式
 * @return 计算结果
 */
public static BigDecimal calculateExpression(String expression) {
    if (StringUtils.isBlank(expression)) {
        throw new IllegalArgumentException("Expression cannot be blank");
    }

    Stack<BigDecimal> numberStack = new Stack<>();
    Stack<Character> operatorStack = new Stack<>();

    for (int i = 0; i < expression.length(); i++) {
        char ch = expression.charAt(i);
        if (Character.isDigit(ch)) {
            StringBuilder sb = new StringBuilder();
            while (i < expression.length() && (Character.isDigit(expression.charAt(i)) || expression.charAt(i) == '.')) {
                sb.append(expression.charAt(i));
                i++;
            }
            i--;

            BigDecimal number = new BigDecimal(sb.toString());
            numberStack.push(number);
        } else if (ch == '(') {
            operatorStack.push(ch);
        } else if (ch == ')') {
            while (!operatorStack.isEmpty() && operatorStack.peek() != '(') {
                BigDecimal result = performOperation(numberStack, operatorStack);
                numberStack.push(result);
            }
            if (!operatorStack.isEmpty() && operatorStack.peek() == '(') {
                operatorStack.pop();
            }
        } else if (isOperator(ch)) {
            while (!operatorStack.isEmpty() && hasHigherPrecedence(ch, operatorStack.peek())) {
                BigDecimal result = performOperation(numberStack, operatorStack);
                numberStack.push(result);
            }
            operatorStack.push(ch);
        }
    }

    while (!operatorStack.isEmpty()) {
        BigDecimal result = performOperation(numberStack, operatorStack);
        numberStack.push(result);
    }

    return numberStack.pop();
}

private static boolean isOperator(char ch) {
    return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}

private static boolean hasHigherPrecedence(char op1, char op2) {
    if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) {
        return true;
    }
    return false;
}

private static BigDecimal performOperation(Stack<BigDecimal> numberStack, Stack<Character> operatorStack) {
    BigDecimal num2 = numberStack.pop();
    BigDecimal num1 = numberStack.pop();
    char operator = operatorStack.pop();

    BigDecimal result;
    switch (operator) {
        case '+':
            result = num1.add(num2);
            break;
        case '-':
            result = num1.subtract(num2);
            break;
        case '*':
            result = num1.multiply(num2);
            break;
        case '/':
            result = num1.divide(num2, 2, RoundingMode.HALF_UP);
            break;
        default:
            throw new IllegalArgumentException("Invalid operator");
    }

    return result;
}

}

// 函数示例
// 使用BigDecimal计算表达式的结果示例
// 入参:expression,要计算的表达式
// 出参:result,计算结果
// 调用示例:
// String expression = "2.5 + 3 (4 - 1)";
// BigDecimal result = BigDecimalCalculator.calculateExpression(expression);
// System.out.println(result);
// 输出结果:例如,计算表达式"2.5 + 3
(4 - 1)"的结果为:11.5
// 则输出结果为:11.5

对二者从代码的可扩展性、健壮性等方面进行对比分析:
一、 可扩展性
文心一言使用了递归方法进行表达式的计算,这种方法可以处理包含任意数量和类型的
操作数和运算符的表达式,可以方便地扩展到处理更复杂的表达。
FuncGPT使用栈的数据结构来处理表达式中的操作符和数字,通过读取每一个字符,并
根据情况进行相应的处理,灵活度及可扩展性较好。
二、 健壮性
FuncGPT利用了Apache Commons Lang库中的StringUtils工具类判断表达式是否为空或空格,相较文心一言,代码的健壮性更好;
三、 运算误差
文心一言和FuncGPT都使用了BigDecimal类进行浮点数的运算,这样可以避免由于浮
点数精度限制导致的运算误差。因此,在运算误差方面,两者表现相当。。

综上所述,个人基于今天的测试对比, FuncGPT(慧函数)在可扩展性和健壮性方面表现较好,但是在运算误差方面和文心一言相当。在实际应用中,开发人员可以根据具体的需求和情况来选择适合的实现方式。

随着人工智能技术的不断进步和发展,相信文心一言和FuncGPT(慧函数)将会在Java编程方面有更加出色的表现,为开发人员的生产和生活带来更多的便利和价值。

相关文章
|
人工智能 数据可视化 定位技术
不会编程也能体验的 AI 魔法,外滩大会代码原生地等你解锁
不会编程也能体验的 AI 魔法,外滩大会代码原生地等你解锁
717 39
|
12月前
|
机器学习/深度学习 数据采集 人工智能
从ChatGPT到文心一言:AI为什么能“懂人话”?——大语言模型的底层逻辑揭秘
从ChatGPT到文心一言:AI为什么能“懂人话”?——大语言模型的底层逻辑揭秘
1336 9
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
355 3
|
人工智能 运维 监控
让天下没有难查的故障:2025 阿里云 AI 原生编程挑战赛正式启动
本次大赛由阿里云主办,云原生应用平台承办,聚焦 Operation Intelligence 的智能运维(AIOps)赛道,为热爱 AI 技术的开发者提供发挥创意和想象力的舞台,借助 LLM 强大的推理能力与标准化整合的多源可观测数据,找到 AI 应用在智能运维(AIOps)场景上的新方式。
1104 31
|
人工智能 自然语言处理 搜索推荐
AI Compass前沿速览:Qoder Agentic编程、vivo Vision头显、AIRI桌面伴侣、RM-Gallery奖励模型平台
AI Compass前沿速览:Qoder Agentic编程、vivo Vision头显、AIRI桌面伴侣、RM-Gallery奖励模型平台
AI Compass前沿速览:Qoder Agentic编程、vivo Vision头显、AIRI桌面伴侣、RM-Gallery奖励模型平台
|
人工智能 算法 小程序
再见 Cursor,Qoder 真香!这波要改写 AI 编程格局
真心建议大家去使用一下这段时间最新推出的一款 AI 编程工具:Qoder 。真的是太好用了,一点也不比 Cursor 差。
1904 10
|
12月前
|
存储 人工智能 JSON
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
本文面向对 AI Coding 感兴趣的朋友介绍 Claude Code。通过此次分享,可以让没有体验过的快速体验,体验过的稍微理解其原理,以便后续更好地使用。
3763 18
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
362 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
758 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡