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

相关文章
|
1月前
|
人工智能 IDE 测试技术
利用AI技术提升编程效率
【10月更文挑战第6天】本文将探讨如何通过人工智能(AI)技术提升编程效率。我们将介绍一些实用的工具和策略,如代码补全、错误检测和自动化测试,以及如何将这些工具整合到你的日常工作流程中。无论你是初学者还是经验丰富的开发者,都可以从这些技巧中受益。让我们一起探索如何利用AI技术来简化编程过程,提高生产力吧!
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
构建智能化编程环境:AI 与代码编辑器的融合
在人工智能的推动下,未来的代码编辑器将转变为智能化编程环境,具备智能代码补全、自动化错误检测与修复、个性化学习支持及自动化代码审查等功能。本文探讨了其核心功能、技术实现(包括机器学习、自然语言处理、深度学习及知识图谱)及应用场景,如辅助新手开发者、提升高级开发者效率和优化团队协作。随着AI技术进步,智能化编程环境将成为软件开发的重要趋势,变革开发者工作方式,提升效率,降低编程门槛,并推动行业创新。
|
1月前
|
人工智能 JSON Java
【极速入门版】编程小白也能轻松上手Comate AI编程插件
【极速入门版】编程小白也能轻松上手Comate AI编程插件
33 0
|
13天前
|
人工智能 自然语言处理 IDE
通义灵码让AI帮你实现自动化编程
通义灵码是由阿里云与通义实验室联合开发的智能编码辅助工具,具备行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答及异常报错排查等功能。该工具支持200多种编程语言,兼容主流IDE,如Visual Studio Code、Visual Studio和JetBrains IDEs。通义灵码在Gartner发布的AI代码助手魔力象限中表现出色,成为唯一进入挑战者象限的中国科技公司。目前,通义灵码下载量已超过470万,每日辅助生成代码超3000万次,被开发者广泛采用。
|
1月前
|
人工智能 IDE Java
AI 代码工具大揭秘:提高编程效率的必备神器!
【10月更文挑战第1天】近年来,人工智能得到了迅猛的发展,并在各行各业都得到了广泛应用。尤其是近两年来,AI开发工具逐渐成为开发者们的新宠,其中 GitHub Copilot 更是引发了无限可能性的探索。
104 9
AI 代码工具大揭秘:提高编程效率的必备神器!
|
3月前
|
人工智能 缓存 Cloud Native
用 Higress AI 网关降低 AI 调用成本 - 阿里云天池云原生编程挑战赛参赛攻略
《Higress AI 网关挑战赛》正在火热进行中,Higress 社区邀请了目前位于排行榜 top5 的选手杨贝宁同学分享他的心得。本文是他整理的参赛攻略。
538 72
|
1月前
|
Python 机器学习/深度学习 人工智能
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
【10月更文挑战第1天】本文通过构建一个简单的强化学习环境,演示了如何创建和训练智能体以完成特定任务。我们使用Python、OpenAI Gym和PyTorch搭建了一个基础的智能体,使其学会在CartPole-v1环境中保持杆子不倒。文中详细介绍了环境设置、神经网络构建及训练过程。此实战案例有助于理解智能体的工作原理及基本训练方法,为更复杂应用奠定基础。首先需安装必要库: ```bash pip install gym torch ``` 接着定义环境并与之交互,实现智能体的训练。通过多个回合的试错学习,智能体逐步优化其策略。这一过程虽从基础做起,但为后续研究提供了良好起点。
128 4
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
|
28天前
|
人工智能 搜索推荐 测试技术
AI 辅助编程的效果衡量
本文主要介绍了如何度量研发效能,以及 AI 辅助编程是如何影响效能的,进而阐述如何衡量 AI 辅助编程带来的收益。
|
1月前
|
人工智能 Python
AI师傅和通义灵码合作助力你学编程
湖北的一位股民通过AI学习了使用通义灵码制作股票浮动止盈点计算器,大幅提升了效率。通过描述需求、编写代码、解释代码和纠错等步骤,实现了从获取股票最高价到计算止盈价的全过程,简化了操作流程,提高了投资决策的准确性。
835
|
29天前
|
人工智能 Java 开发者
基于通义灵码轻松进行编程 在 AI 师傅(AI-Shifu.com)学的通义灵码
作为一名Java开发者,通过使用通义灵码个人版学习Python,学习效率提升了80%。根据AI师傅平台的指导,高效利用AI辅助学习的主要步骤包括:1. 描述需求,了解所需技术;2. 细化需求描述,便于AI高效编程;3. 发送参考指令给AI;4. 执行代码测试;5. 查看代码注释;6. 优化代码。
835
58 1

热门文章

最新文章

下一篇
无影云桌面