ส่วนใหญ่ของทีม .NET ที่เพิ่มฟีเจอร์ AI วันนี้มักต้องเขียนโค้ดพื้นฐานเดียวกัน: ลูกค้า HTTP, นโยบายการลองใหม่, การจัดการความลับสำหรับคีย์ API, และบรรทัดการเรียกเก็บเงินต่อโทเคนบนบัตรเครดิตของใครบางคน Aspose.LLM ใช้วิธีที่แตกต่างออกไป มันเป็นแพ็กเกจ NuGet ที่รันการสรุปผลโมเดลภาษาใหญ่ ภายในกระบวนการของคุณเอง - ไม่มีบริการให้เรียก, ไม่มีคีย์ให้หมุน, และไม่มีคำขอใดออกจากเครื่อง

บทความนี้แนะนำไลบรารี อธิบายแนวคิดสามประการที่ API ของมันสร้างขึ้น และพาคุณผ่านแอปพลิเคชันแชทที่ทำงานได้ หากคุณสามารถเพิ่มการอ้างอิงแพ็กเกจ คุณก็จะสามารถส่งพรอมต์ได้ในไม่กี่สิบบรรทัด.

ทำไมโมเดลในเครื่องถึงสำคัญ

การรันโมเดลในกระบวนการเดียวกันจะเปลี่ยนแปลงสิ่งที่คุณสามารถสร้างได้

  • ข้อมูลคงที่ พรอมต์ไม่เคยออกจากโฮสต์ ซึ่งสำคัญเมื่อคุณทำงานกับสัญญา, บันทึกทางการแพทย์, โค้ดต้นฉบับ หรือสิ่งอื่นใดที่อยู่ภายใต้นโยบายการอยู่อาศัยของข้อมูล.
  • ไม่มีค่าใช้จ่ายต่อโทเคน เมื่อโมเดลอยู่บนดิสก์แล้ว การสรุปผลเป็นค่าใช้จ่ายของ CPU หรือ GPU ที่คุณมีอยู่แล้ว ไม่ใช่การเรียก API ที่คิดค่าใช้จ่ายตามการใช้งาน.
  • ไม่มีการพึ่งพาเครือข่ายขณะทำงาน เครื่องมือเดสก์ท็อป, บริการในสถานที่, และสภาพแวดล้อมที่แยกออกจากเครือข่ายทั้งหมดทำงานในลักษณะเดียวกัน.
  • ศิลปะการปรับใช้หนึ่งชิ้น การกำหนดค่าโมเดลจะมาพร้อมกับแอปพลิเคชันของคุณแทนที่จะอยู่ในแดชบอร์ดของบัญชีแยกต่างหาก.

การแลกเปลี่ยนนี้เป็นเรื่องตรงไปตรงมาและคุ้มค่าที่จะกล่าวไว้ตั้งแต่แรก: คุณต้องจัดหาอุปกรณ์ฮาร์ดแวร์ โมเดลที่ทำงานในเครื่องต้องการหน่วยความจำในเครื่อง และการรันครั้งแรกต้องดาวน์โหลดหลายกิกะไบต์

Aspose.LLM for .NET ในสามแนวคิด

พื้นผิวถูกออกแบบให้มีขนาดเล็กโดยเจตนา
เกือบทุกอย่างที่คุณทำกับ Aspose.LLM เกี่ยวข้องกับสามประเภทนี้

แนวคิดประเภทบทบาท
ใบอนุญาตAspose.LLM.Licenseเปิดใช้งานไลบรารี เรียกใช้ SetLicense ก่อนการใช้ API อื่นใด
พรีเซ็ตe.g. Qwen25Presetรวมไฟล์โมเดลพร้อมพารามิเตอร์การสร้าง เช่น อุณหภูมิของ sampler
อินสแตนซ์ APIAsposeLLMApiจุดเริ่มต้น สร้างจาก preset เก็บการสนทนา และเปิดเผย SendMessageAsync

Preset เป็นสิ่งที่น่าสนใจกว่า. แทนที่จะให้คุณต้องกำหนดเส้นทางโมเดล การตั้งค่า tokenizer และค่าตัวอย่างด้วยตนเอง, preset จะบรรจุชุดการผสมผสานที่ตรวจสอบแล้วว่าดี. Qwen25Preset เป็นจุดเริ่มต้นเริ่มต้นโดยค่าเริ่มต้น, และคุณสามารถปรับพารามิเตอร์ของมันหรือสลับไปใช้ preset อื่นในภายหลังโดยไม่ต้องแก้ไขโค้ดส่วนอื่นของคุณ.

Prerequisites

ก่อนเขียนโค้ดใด ๆ:

  1. ติดตั้งแพคเกจ - Install-Package Aspose.LLM
  2. วางใบอนุญาตของคุณ - วาง Aspose.LLM.lic ไว้ในตำแหน่งที่โปรแกรมสามารถอ่านได้ในขณะรันไทม์
  3. ตรวจสอบงบประมาณหน่วยความจำของคุณ - พรีเซ็ต Qwen25 ต้องการ RAM ว่างอย่างน้อย 8 GB

สำหรับรายละเอียดของผลิตภัณฑ์ โปรดดูที่หน้า Aspose.LLM for .NET product page.

การสนทนาครั้งแรกของคุณ

นี่คือโปรแกรมที่สั้นที่สุดที่สามารถดำเนินการสนทนาจริงได้ โปรดสังเกตการเรียกครั้งที่สองและครั้งที่สาม: อินสแตนซ์ API จะติดตามบริบทด้วยตนเอง ดังนั้นโมเดลยังคงรู้ว่า Alice คือใคร.

สิ่งที่โค้ดทำ

  1. สร้าง License และชี้ไปที่ไฟล์ใบอนุญาตของคุณ.
  2. สร้างอินสแตนซ์ของ Qwen25Preset ด้วยการกำหนดค่าเริ่มต้น.
  3. สร้างอินสแตนซ์ AsposeLLMApi หนึ่งตัวจากพรีเซ็ตนั้น.
  4. ส่งพรอมต์หลายรายการ โดยทั้งหมดใช้การสนทนาเดียวกัน.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;

var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");

var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);

string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);
// Output: 2 + 2 equals 4.

await api.SendMessageAsync("My name is Alice.");
string reply2 = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply2);
// Output: Your name is Alice.

AsposeLLMApi.Create(preset) คืนค่า client ที่รับรู้เซสชัน แต่ละการเรียก SendMessageAsync จะเพิ่ม prompt ไปยังการสนทนาที่กำลังดำเนินอยู่ ดังนั้นคุณจะได้พฤติกรรมหลายรอบโดยไม่ต้องจัดการสถานะด้วยตนเอง คำประกาศ using มีความสำคัญ - อินสแตนซ์เป็นเจ้าของทรัพยากรเนทีฟและต้องถูกทำลาย.

Note: ตัวอย่างเหล่านี้อ้างอิงจากเอกสารอย่างเป็นทางการของ Aspose และยังไม่ได้รับการรันใน sandbox. ตรวจสอบให้แน่ใจก่อนใช้งานในสภาพแวดล้อมของคุณ

การปรับแต่งพฤติกรรมสำหรับคำขอเดียว

คำตอบเชิงสนทนาจะได้ประโยชน์จากความสุ่มบางส่วน ส่วนคณิตศาสตร์ไม่ได้เช่นนั้น แทนที่จะกำหนดค่าตัวอย่างใหม่ ให้สร้างพรีเซ็ตที่สองและส่งต่อให้กับการเรียกเดียวที่ต้องการมัน.

สิ่งที่โค้ดทำ

  1. สร้าง preset เริ่มต้นและอินสแตนซ์ API ตามปกติ.
  2. สร้าง strictPreset ด้วยอุณหภูมิตัวสุ่มที่ต่ำ.
  3. ส่งผ่านไปยัง SendMessageAsync ผ่านอาร์กิวเมนต์ preset.
  4. ปล่อยการเรียกต่อไปให้ใช้ค่าเริ่มต้นเดิม.
using Aspose.LLM.Abstractions.Parameters.Presets;

// Default preset used by the API instance
var defaultPreset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(defaultPreset);

// A more deterministic preset, for this question only
var strictPreset = new Qwen25Preset();
strictPreset.SamplerParameters.Temperature = 0.1f;

string reply = await api.SendMessageAsync(
    "What is the square root of 144?",
    preset: strictPreset);

Console.WriteLine(reply);
// Output: The square root of 144 is 12.

SamplerParameters.Temperature ควบคุมระดับความสุ่มที่ตัวอย่างสร้างขึ้น ค่าที่อยู่ใกล้ 0.1 จะให้ผลลัพธ์ที่ใกล้เคียงกับการกำหนดล่วงหน้า; ค่าที่สูงกว่าจะทำให้วลีมีความหลากหลายมากขึ้น เนื่องจากการตั้งค่าล่วงหน้าถูกจำกัดไว้เฉพาะการเรียกใช้ การแทนที่จึงไม่รั่วไหลไปยังส่วนอื่นของการสนทนา.

การยกเลิกและการหมดเวลา

ความยาวของการสร้างไม่สามารถคาดการณ์ได้อย่างเต็มที่ และคำขอที่ทำงานนานจะบล็อกสิ่งที่กำลังรออยู่ SendMessageAsync ยอมรับ CancellationToken ดังนั้นให้ส่งค่าให้มัน

สิ่งที่โค้ดทำ

  1. สร้าง CancellationTokenSource ด้วยงบประมาณ 30 วินาที.
  2. ส่ง cts.Token ไปยัง SendMessageAsync.
  3. ดักจับ OperationCanceledException และทำการลดระดับอย่างราบรื่น.
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

try
{
    string reply = await api.SendMessageAsync(
        "Write a 500-word essay about migration patterns of the Arctic tern.",
        cancellationToken: cts.Token);
    Console.WriteLine(reply);
}
catch (OperationCanceledException)
{
    Console.WriteLine("Generation timed out.");
}

การยกเลิกทำให้สถานะเซสชันคงเดิม ดังนั้นการสนทนาจะดำเนินต่อไปตามปกติในการเรียกครั้งถัดไป ในตัวจัดการ ASP.NET Core ให้ส่งต่อโทเค็น RequestAborted ของคำขอที่นี่ด้วย – ไม่มีเหตุผลที่จะยังคงสร้างต่อสำหรับลูกค้าที่ได้ตัดการเชื่อมต่อแล้ว

แอปพลิเคชันคอนโซลที่สมบูรณ์

รวมทั้งหมดเข้าด้วยกัน: REPL ที่ทำให้เซสชันหนึ่งคงอยู่ตลอดอายุของกระบวนการและฟื้นฟูจากความล้มเหลวของแต่ละข้อความ

สิ่งที่โค้ดทำ

  1. ตั้งค่าใบอนุญาตและพรีเซ็ตเริ่มต้นหนึ่งครั้งเมื่อเริ่มต้นโปรแกรม.
  2. สร้างอินสแตนซ์ AsposeLLMApi เพียงตัวเดียวสำหรับโปรแกรมทั้งหมด.
  3. วนลูปรับอินพุตจากผู้ใช้จนกว่าผู้ใช้จะพิมพ์ quit.
  4. ส่งแต่ละบรรทัดและพิมพ์การตอบกลับ.
  5. ดักจับข้อยกเว้นต่อข้อความเพื่อให้ความล้มเหลวหนึ่งครั้งไม่ทำให้เซสชันสิ้นสุด.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;

internal class SimpleChatDemo
{
    public static async Task Main()
    {
        var license = new Aspose.LLM.License();
        license.SetLicense("Aspose.LLM.lic");

var preset = new Qwen25Preset();
        using var api = AsposeLLMApi.Create(preset);

Console.WriteLine("Ask me anything. Type 'quit' to exit.");
        while (true)
        {
            Console.Write("> ");
            string? line = Console.ReadLine();
            if (line == null || line.Equals("quit", StringComparison.OrdinalIgnoreCase))
                break;

try
            {
                string reply = await api.SendMessageAsync(line);
                Console.WriteLine(reply);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }
}

จุดการออกแบบสองประการที่ควรนำไปใช้ในแอปพลิเคชันจริงคือ ประการแรก อินสแตนซ์ถูกสร้าง ครั้งเดียว แล้วนำกลับมาใช้ซ้ำ – การสร้างมีค่าใช้จ่ายสูงและตามที่ส่วนต่อไปอธิบาย ไม่อนุญาตให้มีอินสแตนซ์พร้อมกันหลายตัว ประการที่สอง try‑catch อยู่ภายในลูปแทนที่จะอยู่รอบลูป ทำให้ข้อความที่ผิดพลาดเพียงหนึ่งข้อความทำให้เสียเพียงหนึ่งรอบแทนที่จะทำให้เซสชันทั้งหมดเสีย

ประเมินไลบรารีด้วยใบอนุญาตชั่วคราวจาก หน้าใบอนุญาตชั่วคราวของ Aspose

ข้อผิดพลาดที่คุณอาจเจอเป็นอันดับแรก

ข้อผิดพลาดสาเหตุทั่วไปวิธีแก้ไข
Not licensed for this methodไฟล์ใบอนุญาตหายหรือเส้นทางไม่ถูกต้องยืนยันว่า Aspose.LLM.lic สามารถอ่านได้จากไดเรกทอรีทำงานและว่า SetLicense ทำงานก่อนการเรียก API ใด ๆ
Only one AsposeLLMApi instance can be created at a timeมีอินสแตนซ์สองตัวทำงานพร้อมกัน, มักมาจากฟาโครรีที่สร้างต่อคำขอลงทะเบียนอินสแตนซ์เป็นซิงเกิลตัน หรือทำลายอินสแตนซ์ก่อนหน้าก่อนสร้างใหม่
First response takes minutesเอนจินกำลังดาวน์โหลดไบนารีเนทีฟและน้ำหนักโมเดลคาดว่าจะใช้เวลา 5-15 นาทีบนเครื่องที่สะอาด. เรียก Create ระหว่างการเริ่มต้นเพื่อให้ผู้ใช้ไม่ต้องจ่ายค่าใช้จ่าย

แถวที่สองนั้นควรได้รับการเน้นในสถานการณ์การให้บริการ หากคุณกำลังเชื่อมต่อ Aspose.LLM เข้ากับคอนเทนเนอร์ DI ให้ลงทะเบียน AsposeLLMApi เป็น singleton และทำให้การเข้าถึงเป็นแบบเรียงลำดับ - การลงทะเบียนแบบ scoped หรือ transient จะล้มเหลวทันทีเมื่อมีคำขอสองคำขอทับซ้อนกัน.

แหล่งข้อมูลเพิ่มเติม

สรุป

Aspose.LLM ลด “add an LLM to this .NET application” ให้เหลือสามประเภทและหนึ่งเมธอด ไลเซนส์ทำให้ไลบรารีทำงาน, preset กำหนดโมเดลและวิธีการสร้าง, และอินสแตนซ์ AsposeLLMApi ทำหน้าที่เป็นตัวสนทนา จากนั้น SendMessageAsync จัดการกับคำถามเดียว, เซสชันหลายรอบ, การแทนค่าพารามิเตอร์ต่อการเรียก, และการสร้างผลลัพธ์ที่ยาวนานซึ่งสามารถยกเลิกได้.

เริ่มต้นด้วยตัวอย่างคอนโซล, ยืนยันว่าโมเดลทำงานตามที่ฟีเจอร์ของคุณต้องการ, จากนั้นดำเนินการต่อไปยังการทำงานหลายเซสชันและการคงสภาพเมื่อพื้นฐานมั่นคงแล้ว.

FAQs

1. Aspose.LLM for .NET คืออะไร?

ไลบรารี NuGet ที่ทำการ inference โมเดลภาษาแบบขนาดใหญ่ภายในกระบวนการ .NET ของคุณเอง คุณสร้างพรีเซ็ต, สร้างอินสแตนซ์ API, และส่งพรอมต์ — ไม่ต้องใช้บริการภายนอก, ไม่ต้องใช้คีย์ API.

2. ฉันต้องการการเชื่อมต่ออินเทอร์เน็ตเพื่อใช้งานหรือไม่?

ใช้เฉพาะการรันครั้งแรกเท่านั้น การเรียก Create ครั้งแรกจะดาวน์โหลดเอนจินเนทีฟและไฟล์โมเดลที่กำหนดโดยพรีเซ็ต และสินทรัพย์จะถูกแคชไว้ในเครื่องหลังจากนั้น

3. ข้อกำหนดเบื้องต้นสำหรับตัวอย่างโค้ดคืออะไร?

แพคเกจ NuGet ของ Aspose.LLM, ไฟล์ Aspose.LLM.lic ที่ถูกต้อง, และ RAM ว่างเพียงพอสำหรับพรีเซ็ตที่คุณเลือก – ควรเตรียมอย่างน้อย 8 GB สำหรับ Qwen25.

4. ฉันจะเปลี่ยนพฤติกรรมของโมเดลสำหรับคำขอเดียวอย่างไร?

สร้างพรีเซ็ตที่สอง ปรับพารามิเตอร์ของมัน (เช่น SamplerParameters.Temperature) แล้วส่งไปยัง SendMessageAsync ผ่านอาร์กิวเมนต์ preset การเรียกใช้ในภายหลังจะกลับไปใช้พรีเซ็ตเริ่มต้นของอินสแตนซ์.

5. ฉันจะหยุดการสร้างที่ใช้เวลานานเกินไปได้อย่างไร?

ส่ง CancellationToken ไปยัง SendMessageAsync และจับ OperationCanceledException. ตัวสถานะของเซสชันยังคงอยู่หลังจากการยกเลิก ดังนั้นการสนทนาจะดำเนินต่อไปตามปกติ.

6. ทำไมการตอบสนองครั้งแรกถึงช้าเช่นนี้?

การเรียก Create ครั้งแรกจะดาวน์โหลดไบนารีเนทีฟและน้ำหนักของโมเดล ซึ่งอาจใช้เวลา 5‑15 นาทีบนเครื่องที่สะอาดใหม่ ควรอุ่นอินสแตนซ์ขึ้นในขณะเริ่มต้นแอปพลิเคชันแทนที่จะทำในคำขอแรกของผู้ใช้.

อ่านเพิ่มเติม