天天看点

管中窥豹:大语言模型实用性测试

作者:opendotnet

首批8家企业/机构的大模型产品已经通过《生成式人工智能服务管理暂行办法》备案,正式上线面向公众提供服务。

  • • 五家北京企业机构:百度(文心一言)、抖音(云雀大模型)、智谱AI(GLM大模型)、中科院(紫东太初大模型)、百川智能(百川大模型)
  • • 三家上海企业机构:商汤(日日新大模型)、MiniMax(ABAB大模型)、上海人工智能实验室(书生通用大模型)

接下来压力似乎给到了使用者,也是一个“愁”。多个大语言模型发布,用哪个?哪个好用?

俗话说“黑猫白猫,抓到老鼠就是好猫”,本文尝试抛开专业的技术参数指标,从实用性、是否解决问题的这个切入点,对大语言模型做一个简单的实用性测试。

测试方法

目前为止使用以下大语言模型,三个国内,一个国外:

  • • 天工AI助手:https://neice.tiangong.cn
  • • 智普清言:https://chatglm.cn
  • • 文心一言:https://yiyan.baidu.com
  • • ChatGPT 3.5-Turbo

问AI同一个问题:(问题是随机的,这两天开发过程中遇到的。)

“在 Entity Framework Core 中 Microsoft.EntityFrameworkCore.Storage.ValueConversion 命名空间的 ValueConverter 类,请解释该类的作用和用法,给出示例。”

没有考虑提示工程,问题本身有几个需要AI进行的推理点:

  1. 1. 没有明确 EF Core 具体版本,当前最新稳定版 EF Core 7.0 (EF7) 于 2022 年 11 月发布,看AI给出的答案是否最新。
  2. 2. 问题上下文有3个范围:

    EF Core

    ->

    Microsoft.EntityFrameworkCore.Storage.ValueConversion

    ->

    ValueConverter

    ,看AI是否能推测出问题的是值转换器。
  3. 3. 明确回答内容包含:解释作用、用法和示例,看AI反馈结果是否是否完整。
由于AI每次回答问题都不相同,无法复现,只能以当时返回结果为准。

为了验证AI给出的答案是否准确,详细查看官方最新文档进行验证:

  • • 官方文档:ValueConverter 类
  • • 官方文档:值转换
微软官方文档的通病:有点反人类,内容组织没有逻辑性,不方便理解,但是相对准确。

总结要点,值转换器的作用有两点:

  • • 此转换可以是从同一类型的一个值转换为另一个值,例如:加密字符串。
  • • 从一种类型的值转换为另一种类型的值,例如:数据库中枚举值和字符串的相互转换。

给出的示例至少应该演示:

  • • 如何自定义值转换器
  • • 如何应用值转换器

评判方式:以实用性为标准,判断问题的回答质量,根据经验打分。

接下来,把各个大语言模块给出的回复原文,逐一贴出来,大家先看看其内容的准确性。每个回复会做一个简单分析,最后会给出综合对比结果。

“天工AI助手”回复原文:

ValueConverter

类是 Entity Framework Core 中用于类型转换的核心类之一。它的主要作用是将一个实体属性的值从数据库中读取出来后,将其转换为实体属性应该存储的类型,并将其赋值给实体属性。同样地,当将实体属性的值保存到数据库中时,ValueConverter 类也会将实体属性的值转换为数据库中应该存储的类型。

ValueConverter

类的使用非常简单,只需要继承它并重写其中的一些方法即可。具体来说,

ValueConverter

类中有两个抽象方法需要重写:

  1. 1.

    CanConvertFrom

    方法:用于判断当前 ValueConverter 是否可以将指定类型的值转换为目标类型。
  2. 2.

    ConvertFrom

    方法:用于将指定类型的值转换为目标类型。

在实际使用中,我们通常会继承 ValueConverter 类,并在 CanConvertFrom 方法中判断当前 ValueConverter 是否可以将指定类型的值转换为目标类型。如果可以转换,则在 ConvertFrom 方法中进行实际的转换操作。例如,以下是一个将字符串类型的值转换为整数类型的 ValueConverter 示例:

public class StringToIntConverter : ValueConverter<string, int>
{
public StringToIntConverter() : base(
 v => int.TryParse(v, out int result) ? result : (int?),
 v => v.HasValue ? v.Value.ToString() : )
 { }
}           

在上述示例中,我们首先重写了 CanConvertFrom 方法,在该方法中判断当前 ValueConverter 是否可以将字符串类型的值转换为整数类型。如果可以转换,则返回 true,否则返回 false。在 ConvertFrom 方法中,我们使用 int.TryParse 方法将字符串类型的值转换为整数类型,并将转换后的整数类型的值返回。

在使用 ValueConverter 类时,我们需要在实体属性上使用 [ValueConverter] 特性,并将 ValueConverter 类的类型作为特性参数传入。例如:

public class MyEntity
{
 [ValueConverter(typeof(StringToIntConverter))]
public int MyIntProperty { get; set; }
}           

在上述示例中,我们将

StringToIntConverter

类型的值作为特性参数传入 [ValueConverter] 特性中,以指示 Entity Framework Core 在读取 MyIntProperty 属性时,使用 StringToIntConverter 类型的值进行转换。

质量评估

  • • 作用:对 ValueConverter 作用描述准确
  • • 用法
    • • 内容不准确:构造函数有3个函数需要重写,示例中使用2个,肯定不正确。
    • • 应用不灵活:给出的示例只对某个属性生效
  • • 示例:
    • • 示例不一致:CanConvertFrom 和 ConvertFrom 重写,和示例中构造函数传参不一致,示例应该给出重写方法的示例

“文心一言”回复原文:

在 Entity Framework Core 中,

Microsoft.EntityFrameworkCore.Storage.ValueConversion

命名空间下的

ValueConverter

类用于在将 CLR 类型映射到数据库类型或反向映射时定义自定义转换逻辑。这对于需要在数据存储级别进行特殊类型转换的情况非常有用。

ValueConverter

类有两个主要方法:

ConvertTo

ConvertFrom

ConvertTo

方法用于将 CLR 类型转换为数据库类型,而

ConvertFrom

方法用于将数据库类型转换为 CLR 类型。

以下是

ValueConverter

类的基本用法示例:

  1. 1. 创建一个自定义的

    ValueConverter

    类。例如,我们创建一个将

    DateTimeOffset

    类型转换为数据库中

    datetimeoffset

    类型的

    ValueConverter

public class DateTimeOffsetValueConverter : ValueConverter
{
public DateTimeOffsetValueConverter(DbType dbType)
 : base(DbType.DateTimeOffset, Array.Empty<DbType>())
 {
 }

public override object ConvertTo(ITypeInformation value, DbType dbType, object context)
 {
// 将 DateTimeOffset 转换为数据库中的 datetimeoffset 类型
return value.Value.ToSqlDateTimeOffset();
 }

public override object ConvertFrom(object value, IServiceProvider serviceProvider)
 {
// 将数据库中的 datetimeoffset 类型转换为 DateTimeOffset
return ((IDateTimeOffset)value).ToDateTimeOffset();
 }
}           
  1. 1. 在上下文类中注册自定义的

    ValueConverter

    。这可以通过实现

    IModel

    接口并重写

    GetValueConverter

    方法来完成。
public class MyDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 => optionsBuilder.UseSqlServer(@"your-connection-string");

public DbSet<Entity> Entities { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
 modelBuilder.Entity<Entity>().Property(e => e.DateProperty)
 .HasConversion(new DateTimeOffsetValueConverter(DbType.DateTimeOffset));
 }
}           

在上述示例中,我们创建了一个将

DateTimeOffset

类型转换为数据库中

datetimeoffset

类型的自定义

ValueConverter

。然后,在上下文类中,我们使用

HasConversion

方法注册了该转换器,并将其应用于实体类的

DateProperty

属性。这样,当我们将实体保存到数据库或从数据库加载实体时,将自动应用自定义的转换逻辑。

质量评估

  • • 作用:对 ValueConverter 作用描述不全面,只提到类型转换没有说明值转换的作用。
  • • 用法
    • • 内容不准确:

      ValueConverter

      中并没有

      ConvertTo

      ConvertFrom

      方法
  • • 示例:
    • • 示例一致:由于用法错误,示例也没有参考价值。

“职普清言”回复原文:

ValueConverter

类位于

Microsoft.EntityFrameworkCore.Storage.ValueConversion

命名空间中,它是 Entity Framework Core 用于将数据库中的值转换为实体类中的值的一个核心类。这个类提供了一些静态方法,用于在插入或更新实体时将实体类的属性值转换为数据库中的相应值,以及在查询实体时将数据库中的值转换为实体类的属性值。这些方法可以确保在数据库中存储的数据与实体类中的数据保持一致性,无论数据库中存储的数据类型是否与实体类中的类型完全匹配。 用法:

  1. 1. 添加引用:在使用

    ValueConverter

    类之前,需要确保已添加相应的引用。在项目中安装 Microsoft.EntityFrameworkCore.Tools 包,并通过命令行添加如下引用:

    add-package Microsoft.EntityFrameworkCore.Tools

  2. 2. 创建实体类:创建一个与数据库表对应的实体类,并在属性中使用

    DbType

    属性指定数据库中的数据类型。例如:

    public class MyTable { [Key] public int Id { get; set; } [Column(TypeName = "nvarchar(50)")] public string Name { get; set; } [Column(TypeName = "datetime")] public DateTime DateOfBirth { get; set; } }

  3. 3. 使用

    ValueConverter

    类:在插入或更新实体时,使用

    ValueConverter

    类的静态方法将实体类的属性值转换为数据库中的相应值。在查询实体时,使用

    ValueConverter

    类的静态方法将数据库中的值转换为实体类的属性值。 以下是一个插入实体的示例:

    using (var context = new MyDbContext()) { var person = new MyTable { Name = "John Doe", DateOfBirth = new DateTime(1990, 1, 1) }; context.MyTable.Add(person); context.SaveChanges(); }

    以下是一个查询实体的示例:

    using (var context = new MyDbContext()) { var person = context.MyTable.FirstOrDefault(); if (person!= ) { string name = Convert.ToString(person.Name); DateTime dateOfBirth = Convert.ToDateTime(person.DateOfBirth); // 处理查询结果 } }

  4. 4. 自定义转换器:如果需要自定义转换器,可以创建一个继承自

    ValueConverter

    的类,并实现相应的转换方法。例如,以下代码创建了一个自定义的

    DateConverter

    类,用于将

    DateTime

    类型转换为

    Date

    类型:

    public class DateConverter : ValueConverter<Date, DateTime> { protected override void ConvertValue(DateTime source, Date destination, ref bool cancel) { destination = new Date(source.Year, source.Month, source.Day); } protected override void ConvertBackValue(Date source, DateTime destination, ref bool cancel) { destination = new DateTime(source.Year, source.Month, source.Day); } }

    然后,在实体类中使用自定义的转换器:

    public class MyTable { [Key] public int Id { get; set; } [Column(TypeName = "date")] [ValueConverter(typeof(DateConverter))] public Date DateOfBirth { get; set; } }

    质量评估

  • • 作用:对 ValueConverter 作用描述相对全面。
  • • 用法
    • • 提供详细步骤,过程完整。
    • • 自定义值转换器错误
  • • 示例:示例一致,思路清晰。

“ChatGPT”回复原文:

在 Entity Framework Core 中,

Microsoft.EntityFrameworkCore.Storage.ValueConversion

命名空间中的

ValueConverter

类用于在实体对象和数据库之间进行值的转换。

ValueConverter

类的作用是将一个数据类型的值转换为另一个数据类型的值,以便在实体对象和数据库之间进行无缝的数据交互。它提供了一种简单的方式来转换值,从而避免在编写查询语句和处理数据时出现混乱或错误。

ValueConverter

类可以通过在

DbContext

中的

OnModelCreating

方法中配置来使用。在该方法中,可以使用

ValueConverter

方法为属性指定一个值转换器,以便在实体对象和数据库之间进行自动转换。

以下是使用

ValueConverter

的示例:

首先,定义一个实体类,包含一个叫做 "Age" 的属性,该属性的类型是 int。

public class Person
{
public int Age { get; set; }
}           

然后,创建一个

DbContext

类,并在

OnModelCreating

方法中配置 Age 属性的值转换器。

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

public class MyDbContext : DbContext
{
public DbSet<Person> People { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
 optionsBuilder.UseSqlServer("YourConnectionString");
 }

protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
var converter = new ValueConverter<int, string>(
 v => v.ToString(),
 v => int.Parse(v));

 modelBuilder.Entity<Person>()
 .Property(p => p.Age)
 .HasConversion(converter);
 }
}           

在上述示例中,我们定义了一个将

int

类型的值转换为

string

类型的值的

ValueConverter

。在配置

Age

属性时,我们使用

HasConversion

方法来指定该值转换器。这样,当将

Person

对象保存到数据库中时,

Age

属性的值将被转换为字符串类型,而在从数据库中检索

Person

对象时,

Age

属性的值将被转换回整数类型。

这样,使用

ValueConverter

,我们可以在实体对象和数据库之间进行灵活的值转换,并确保在数据交互过程中数据的完整性和一致性。

质量评估

  • • 作用:对 ValueConverter 作用描述全面,3句话,简单清晰有重点。
  • • 用法:代码正确,步骤清晰。
  • • 示例:示例一致,思路清晰。

对比结果

LLM 作用 用法 示例
天工AI助手 描述全面,提到了值和类型的转换。 用法错误,并不存在回复的两个抽象方法 示例正确,与提到的用法不一致
文心一言 描述不全,只提到了类型转换。 用法错误,并不存在回复的两个方法。 定义值转换器的示例错误
智普 描述相对全面 提供详细步骤,过程完整,自定义值转换器错误。 示例一致,思路清晰。
ChatGPT 描述全面,简单清晰有重点。 代码正确,步骤清晰。 示例一致,思路清晰。

通过以上对比,ChatGPT 综合准确度高,国内大语言模型不相伯仲。注:本测试结论非专业不严谨凭主观。

思考:如何正确看待和使用大语言模型

  1. 1. 大语言模型的训练素材部分来源于网络,素材的不准确导致不能保证其反馈结果的正确性。
  2. 2. 大语言模块已经尽可能给我们一个“看似”正确的答案,经过技术手段伪装掺杂着“不正确的”正确答案,使用者一定要经过实际验证,不要盲从 AI生成的内容,特别是专业领域的知识。
  3. 3. 大语言模块比搜索引擎给出的答案要简单、直接,更懂得用户想搜什么,最关键没有广告的干扰,对话的方式更加人性化,是搜索引擎的最好替代。

毫无疑问,大语言模块已经展现了高效的生产力,应该积极拥抱,大胆尝试、小心验证。

继续阅读