文心一言与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编程方面有更加出色的表现,为开发人员的生产和生活带来更多的便利和价值。

相关文章
|
28天前
|
人工智能 IDE 程序员
一文梳理我们是如何打造出国内领先的 AI 编程助手「通义灵码」
大语言模型的革命性突破使智能编程成为了可能,通义灵码正是基于通义大模型打造的 AI 编程助手,通过 IDE 插件的形式提供代码补全、单元测试生成等功能,能达到毫秒级的响应速度。目前,通义灵码已在阿里云内部及多家企业中应用,阿里云也在探索多智能体产品,即 AI 程序员,助力数字世界的蓬勃发展,颠覆 IT 生产力。
12867 129
|
4天前
|
人工智能 缓存 Cloud Native
用 Higress AI 网关降低 AI 调用成本 - 阿里云天池云原生编程挑战赛参赛攻略
《Higress AI 网关挑战赛》正在火热进行中,Higress 社区邀请了目前位于排行榜 top5 的选手杨贝宁同学分享他的心得。本文是他整理的参赛攻略。
150 65
|
5天前
|
机器学习/深度学习 人工智能 算法
揭秘AI编程:从零开始的机器学习之旅
本文将带你走进人工智能的奇妙世界,一起探索机器学习的奥秘。我们将从最基础的概念入手,逐步深入到实际应用中,让你在轻松愉快的阅读过程中,对AI编程有一个全面而深刻的理解。无论你是编程新手,还是有一定基础的开发者,都能在这篇文章中找到你需要的信息和启示。让我们一起开启这场充满智慧和乐趣的旅程吧!
17 1
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
AI是如何在编程中提升效率的
在快速发展的科技时代,人工智能(AI)已从科幻概念变为现实,尤其在软件开发领域产生了深远影响。AI通过自然语言处理技术准确理解需求并自动生成初步代码框架,大幅减少需求分析与设计工作量。同时,智能代码补全、代码审查及自动化测试等工具显著提升了编码与测试效率,基于大数据分析和机器学习预测所需代码片段,自动发现并修正潜在错误,确保软件质量的同时减轻开发者负担。
|
14天前
|
存储 人工智能 自然语言处理
AI编程助手那些事儿
最近跟身边的程序员老杆子讨论需求时,惊奇的发现,他居然没使用AI编程助手。一时间有2个想法从大脑闪过,然后心里还带了一丝轻蔑。
AI编程助手那些事儿
|
20天前
|
人工智能 JavaScript 开发工具
C++中的AI编程助手添加
今天为大家推荐一款适配了 Viusal Studio(本文使用),VS Code(本文使用),JetBrains系列以及Vim等多种编译器环境的插件 Fitten Code,Fitten Code 是由非十大模型驱动的 AI 编程助手,它可以自动生成代码,提升开发效率,帮您调试 Bug,节省您的时间,另外还可以对话聊天,解决您编程碰到的问题。 Fitten Code免费且支持 80 多种语言:Python、C++、Javascript、Typescript、Java等。
67 8
|
2天前
|
人工智能 IDE 测试技术
Visual Studio版本的AI编程助手
Visual Studio 是一个出色的 IDE,可用于构建适用于 Windows、Mac、Linux、iOS 和 Android 的丰富、精美的跨平台应用程序。 使用一系列技术(例如 WinForms、WPF、WinUI、MAUI 或 Xamarin)构建丰富。 1、安装 点击上方工具栏拓展选项,选择管理拓展选项 接着在联机页面中搜索"FItten Code",并点击下载,下载完成后重启Visual Studio 在扩展选项中选中fitten,选择Open Chat Window进入登录界面,完成注册登录 2、智能补全 打开代码文件,输入一段代码,Fitten Code 就会为您
9 0
|
1月前
|
人工智能 IDE 测试技术
采用Visual Studio版本的AI编程助手
Visual Studio 是多平台IDE,用于构建Windows、Mac、Linux、iOS和Android应用。安装Fitten Code插件可增强其功能,如智能补全、AI问答、代码生成、翻译、注释自动生成、代码解释和测试用例创建。通过扩展商店搜索安装Fitten Code,登录后体验上述特性。支持VS Code、JetBrains IDE、Visual Studio和Vim。访问[https://code.fittentech.com/](https://code.fittentech.com/)获取更多信息。
46 4
|
1月前
|
人工智能 搜索推荐 vr&ar
苹果手机iOS18最新升级:植入AI人工智能,国内百度文心一言,国外GPT4o来辅助
iOS 18亮点速览:AI强化的Siri、RCS安卓消息兼容、自定义主屏、辅助功能增强,VR进步,新隐私工具,包括锁定APP和眼动追踪。Passwords app保障安全,Apple Intelligence提升个性化体验。
85 1
|
2月前
|
人工智能 算法 定位技术
[AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
发现Aider,一个能在终端中与AI搭档编程的工具,让你的编程体验更智能、更有趣。
[AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!