@iEricLee 创建时间 : 2023-09-02 19:55:49 最后修改时间 : 2023-09-02 19:59:44
本文通过对比天工 AI 助手、智普清言、文心一言和 ChatGPT 3.5-Turbo 四个大语言模型对同一问题的回答,考察它们的实用性和准确性。 原文链接:管中窥豹:大语言模型实用性测试
首批8家企业/机构的大模型产品已经通过《生成式人工智能服务管理暂行办法》备案,正式上线面向公众提供服务。
接下来压力似乎给到了使用者,也是一个“愁”。多个大语言模型发布,用哪个?哪个好用?
俗话说“黑猫白猫,抓到老鼠就是好猫”,本文尝试抛开专业的技术参数指标,从实用性、是否解决问题的这个切入点,对大语言模型做一个简单的实用性测试。
目前为止使用以下大语言模型,三个国内,一个国外:
问AI同一个问题:(问题是随机的,这两天开发过程中遇到的。)
“在 Entity Framework Core 中 Microsoft.EntityFrameworkCore.Storage.ValueConversion 命名空间的 ValueConverter 类,请解释该类的作用和用法,给出示例。”
没有考虑提示工程,问题本身有几个需要AI进行的推理点:
EF Core
-> Microsoft.EntityFrameworkCore.Storage.ValueConversion
-> ValueConverter
,看AI是否能推测出问题的是值转换器。由于AI每次回答问题都不相同,无法复现,只能以当时返回结果为准。
为了验证AI给出的答案是否准确,详细查看官方最新文档进行验证:
微软官方文档的通病:有点反人类,内容组织没有逻辑性,不方便理解,但是足够准确。
总结要点,值转换器的作用有两点:
给出的示例至少应该演示:
评判方式:以实用性为标准,判断问题的回答质量,根据经验打分。
接下来,把各个大语言模块给出的回复原文,逐一贴出来,大家先看看其内容的准确性。每个回复会做一个简单分析,最后会给出综合对比结果。
ValueConverter
类是 Entity Framework Core 中用于类型转换的核心类之一。它的主要作用是将一个实体属性的值从数据库中读取出来后,将其转换为实体属性应该存储的类型,并将其赋值给实体属性。同样地,当将实体属性的值保存到数据库中时,ValueConverter 类也会将实体属性的值转换为数据库中应该存储的类型。
ValueConverter
类的使用非常简单,只需要继承它并重写其中的一些方法即可。具体来说,ValueConverter
类中有两个抽象方法需要重写:
CanConvertFrom
方法:用于判断当前 ValueConverter 是否可以将指定类型的值转换为目标类型。ConvertFrom
方法:用于将指定类型的值转换为目标类型。在实际使用中,我们通常会继承 ValueConverter 类,并在 CanConvertFrom 方法中判断当前 ValueConverter 是否可以将指定类型的值转换为目标类型。如果可以转换,则在 ConvertFrom 方法中进行实际的转换操作。例如,以下是一个将字符串类型的值转换为整数类型的 ValueConverter 示例:
public class StringToIntConverter : ValueConverter<string, int>
{
public StringToIntConverter() : base(
v => int.TryParse(v, out int result) ? result : (int?)null,
v => v.HasValue ? v.Value.ToString() : null)
{ }
}
在上述示例中,我们首先重写了 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 类型的值进行转换。
在 Entity Framework Core 中,Microsoft.EntityFrameworkCore.Storage.ValueConversion
命名空间下的 ValueConverter
类用于在将 CLR 类型映射到数据库类型或反向映射时定义自定义转换逻辑。这对于需要在数据存储级别进行特殊类型转换的情况非常有用。
ValueConverter
类有两个主要方法:ConvertTo
和 ConvertFrom
。ConvertTo
方法用于将 CLR 类型转换为数据库类型,而 ConvertFrom
方法用于将数据库类型转换为 CLR 类型。
以下是 ValueConverter
类的基本用法示例:
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();
}
}
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
中并没有 ConvertTo
和 ConvertFrom
方法ValueConverter
类位于 Microsoft.EntityFrameworkCore.Storage.ValueConversion
命名空间中,它是 Entity Framework Core 用于将数据库中的值转换为实体类中的值的一个核心类。这个类提供了一些静态方法,用于在插入或更新实体时将实体类的属性值转换为数据库中的相应值,以及在查询实体时将数据库中的值转换为实体类的属性值。这些方法可以确保在数据库中存储的数据与实体类中的数据保持一致性,无论数据库中存储的数据类型是否与实体类中的类型完全匹配。
用法:
ValueConverter
类之前,需要确保已添加相应的引用。在项目中安装 Microsoft.EntityFrameworkCore.Tools 包,并通过命令行添加如下引用:add-package Microsoft.EntityFrameworkCore.Tools
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; }
}
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!= null)
{
string name = Convert.ToString(person.Name);
DateTime dateOfBirth = Convert.ToDateTime(person.DateOfBirth);
// 处理查询结果
}
}
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; }
}
在 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
,我们可以在实体对象和数据库之间进行灵活的值转换,并确保在数据交互过程中数据的完整性和一致性。
LLM | 作用 | 用法 | 示例 |
---|---|---|---|
天工AI助手 | 描述全面,提到了值和类型的转换。 | 用法错误,并不存在回复的两个抽象方法 | 示例正确,与提到的用法不一致 |
文心一言 | 描述不全,只提到了类型转换。 | 用法错误,并不存在回复的两个方法。 | 定义值转换器的示例错误 |
智普 | 描述相对全面 | 提供详细步骤,过程完整,自定义值转换器错误。 | 示例一致,思路清晰。 |
ChatGPT | 描述全面,简单清晰有重点。 | 代码正确,步骤清晰。 | 示例一致,思路清晰。 |
通过以上对比,ChatGPT 综合准确度高,国内大语言模型不相伯仲。注:本测试结论非专业不严谨凭感觉。
大语言模型的训练素材部分来源于网络,素材的不准确导致不能保证其反馈结果的正确性。
大语言模块已经尽可能给我们一个“看似”正确的答案,经过技术手段伪装掺杂着“不正确的”正确答案,使用者一定要经过实际验证,不要盲从 AI生成的内容,特别是专业领域的知识。
大语言模块比搜索引擎给出的答案要简单、直接,更懂得用户想搜什么,最关键没有广告的干扰,对话的方式更加人性化,是搜索引擎的最好替代。
毫无疑问,大语言模块已经展现了高效的生产力,应该积极拥抱,大胆尝试、小心验证。