这是一个基于 LLamaSharp 框架开发的 C# 本地离线 Qwen 大模型控制台聊天程序,核心特点是无网络依赖、无上下文记忆、纯单次问答,适合快速本地部署和隐私保护场景。

程序启动时会加载指定路径下的 Qwen2.5-7B-Instruct 量化模型(如 qwen2.5-7b-instruct-1m-q4_k_m.gguf),加载过程屏蔽了冗余日志,仅显示必要提示。模型加载完成后,控制台会打印简洁的欢迎界面,明确说明模型名称、运行模式和退出指令。

核心逻辑采用单次对话模式:每次用户提问时,程序会按 Qwen 官方的 im_start/im_end 模板拼接系统提示词和用户问题,直接发送给模型推理,不保存任何对话历史,确保每次提问都是全新独立的会话,完全规避上下文记忆带来的信息泄露或逻辑干扰问题。

推理过程采用流式输出,用户能实时看到模型生成的回答,同时设置了最大生成长度、温度参数和终止符,保证回答的可控性和简洁性。用户输入 exit 即可退出程序,资源会自动释放。

整个程序代码极简,无知识库、无复杂依赖,只需配置模型路径即可运行,非常适合工业控制、敏感数据场景下的离线 AI 问答需求,兼顾了轻量化、隐私性和易用性。


模型下载链接:https://modelscope.cn/models/ngxson/Qwen2.5-7B-Instruct-1M-Q4_K_M-GGUF/files

库下载:使用vs2022的nuget。
using LLama;
using LLama.Common;
using LLama.Sampling;

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using LLama;
using LLama.Common;
using LLama.Sampling;

namespace QwenConsole
{
    class Program
    {
        private static LLamaWeights _model;
        private static LLamaContext _context;
        private static InteractiveExecutor _executor;

        private static readonly InferenceParams _infParams = new InferenceParams
        {
            MaxTokens = 800,
            AntiPrompts = new[] { "<|im_end|>" },
            SamplingPipeline = new DefaultSamplingPipeline { Temperature = 0.3f }
        };

        private static string _modelPath = "qwen2.5-7b-instruct-1m-q4_k_m.gguf";

        static async Task Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            Console.WriteLine("正在加载模型...");

            // 屏蔽模型加载日志
            using (var nullWriter = new StringWriter())
            {
                Console.SetOut(nullWriter);
                var parameters = new ModelParams(_modelPath)
                {
                    ContextSize = 8192,
                    GpuLayerCount = 99,
                    Threads = Environment.ProcessorCount,
                };

                _model = LLamaWeights.LoadFromFile(parameters);
                _context = new LLamaContext(_model, parameters);
                _executor = new InteractiveExecutor(_context);
            }

            // 恢复控制台输出
            Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true });

            // 打印和截图完全一致的欢迎界面
            Console.WriteLine("================================================================================================");
            Console.WriteLine("                              本地离线大模型聊天助理");
            Console.WriteLine($"模型:  qwen2.5-7b-instruct-1m-q4_k_m.gguf");
            Console.WriteLine("          纯本地运行,无需联网,保护隐私");
            Console.WriteLine("    输入 exit 退出,直接输入内容开始对话");
            Console.WriteLine("================================================================================================");
            Console.WriteLine();

            while (true)
            {
                Console.Write("你:");
                string input = Console.ReadLine()?.Trim();
                if (string.IsNullOrEmpty(input)) continue;

                if (input.ToLower() == "exit") break;

                await InferAnswer(input);
                Console.WriteLine("\n");
            }

            _context?.Dispose();
            _model?.Dispose();
        }

        static async Task InferAnswer(string question)
        {
            // 单次对话,无任何上下文记忆
            string prompt = $@"<|im_start|>system
你是一个有用的AI助手<|im_end|>
<|im_start|>user
{question}<|im_end|>
<|im_start|>assistant
";

            Console.Write("AI:");
            await foreach (var token in _executor.InferAsync(prompt, _infParams))
            {
                if (token.Contains("<|im_end|>")) break;
                Console.Write(token);
            }
        }
    }
}

轻量化、隐私性和易用性。

更多推荐