天天看點

管中窺豹:大語言模型實用性測試

作者: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. 大語言子產品比搜尋引擎給出的答案要簡單、直接,更懂得使用者想搜什麼,最關鍵沒有廣告的幹擾,對話的方式更加人性化,是搜尋引擎的最好替代。

毫無疑問,大語言子產品已經展現了高效的生産力,應該積極擁抱,大膽嘗試、小心驗證。

繼續閱讀