Unity3d接入DeepSeek,豆包,通义千问实现对话

先演示一下效果
 

AI模型演示


1.接入DeepSeek文档地址:对话补全 | DeepSeek API Docs

(1).需要申请一个API keys,申请地址如下:DeepSeek,点击创建
(2).拿到Key就可以向deepseek发起请求了,可以采用StreamingDownloadHandler数据流接收或者DownloadHandlerBuffer数据加载完毕再处理

using (UnityWebRequest request = new UnityWebRequest(URL, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonBody);
            request.uploadHandler = new UploadHandlerRaw(bodyRaw);
            request.downloadHandler = new StreamingDownloadHandler(DataStream.Instance.ParseResponseChunk);
            request.SetRequestHeader("Content-Type", "application/json");
            request.SetRequestHeader("Authorization", Key);

            yield return request.SendWebRequest();
            if (request.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError("Request failed: " + request.error);
            }
        }

(3).拿到数据流后,如下
 

高效率的学习不仅仅是投入大量时间,更重要的是如何有效地利用这些时间。以下是一些提高学习效率的策略:

### 1. **明确目标**
   - **设定具体目标**:明确你想要达到的学习目标,而不是盲目地学习。目标可以是短期的(如完成某一章节)或长期的(如通过考试)。
   - **SMART原则**:确保目标是具体的(Specific)、可衡量的(Measurable)、可实现的(Achievable)、相关的(Relevant)和有时间限制的(Time-bound)。

### 2. **制定计划**
   - **时间管理**:制定一个合理的学习计划,分配好每天的学习时间。使用番茄工作法(25分钟学习+5分钟休息)或其他时间管理工具来提高专注力。
   - **优先级排序**:根据任务的重要性和紧急性,优先处理最重要的内容。

### 3. **主动学习**
   - **积极参与**:不要只是被动地阅读或听讲,尝试通过提问、讨论、总结等方式积极参与学习过程。
   - **自我测试**:通过自我测试或模拟考试来检验自己的理解程度,找出薄弱环节。

### 4. **深度理解**
   - **理解而非记忆**:尽量理解概念背后的原理,而不是单纯记忆。理解后,知识更容易被长期记住。
   - **联系实际**:将所学知识与实际生活中的例子或问题联系起来,帮助加深理解。

(4).因为是markdown格式的,需要引入markdown进行文本解析
 

public string ConvertMarkdownToRichText(string markdown)
    {
        // 1. 先提取代码块,防止误替换
        Dictionary<string, string> codeBlockPlaceholders = new Dictionary<string, string>();
        int codeBlockIndex = 0;

        // 匹配 ```csharp ... ``` 代码块并替换为占位符
        markdown = Regex.Replace(markdown, @"```csharp\n([\s\S]+?)\n```", match =>
        {
            string key = $"[CODEBLOCK_{codeBlockIndex}]";
            codeBlockPlaceholders[key] = $"<color=#00ff00>{match.Groups[1].Value}</color>";
            codeBlockIndex++;
            return key;
        });

        // 2. 处理标题
        markdown = Regex.Replace(markdown, @"^###### (.+)$", "<size=28><b>$1</b></size>", RegexOptions.Multiline);
        markdown = Regex.Replace(markdown, @"^##### (.+)$", "<size=30><b>$1</b></size>", RegexOptions.Multiline);
        markdown = Regex.Replace(markdown, @"^#### (.+)$", "<size=32><b>$1</b></size>", RegexOptions.Multiline);
        markdown = Regex.Replace(markdown, @"^### (.+)$", "<size=36><b>$1</b></size>", RegexOptions.Multiline);
        markdown = Regex.Replace(markdown, @"^## (.+)$", "<size=40><b>$1</b></size>", RegexOptions.Multiline);
        markdown = Regex.Replace(markdown, @"^# (.+)$", "<size=45><b>$1</b></size>", RegexOptions.Multiline);

        // 3. 处理加粗 **text** 或 __text__
        markdown = Regex.Replace(markdown, @"\*\*(.+?)\*\*", "<b>$1</b>");
        markdown = Regex.Replace(markdown, @"__(.+?)__", "<b>$1</b>");

        // 4. 处理斜体 *text* 或 _text_
        markdown = Regex.Replace(markdown, @"\*(.+?)\*", "<i>$1</i>");
        markdown = Regex.Replace(markdown, @"_(.+?)_", "<i>$1</i>");

        // 替换全角>为半角>
        markdown = Regex.Replace(markdown, ">", ">");
        // 替换全角<为半角<
        markdown = Regex.Replace(markdown, "<", "<");

        // 5. 处理单行代码 `inline code`
        markdown = Regex.Replace(markdown, @"`(.+?)`", "<color=#FFA500>$1</color>"); // 使用橙色显示内联代码

        // 6. 还原代码块
        foreach (var entry in codeBlockPlaceholders)
        {
            markdown = markdown.Replace(entry.Key, entry.Value);
        }
        return markdown;
    }

(5).解析完毕后使用TMP_Text组件进行显示,效果如下:

(6).为了避免同一个问题询问多次,可以将请求的结果放入数据库中,方便下次直接查看,推荐使用SQLite进行保存:我这里主要保存,问题,回答,来源,日期

using System.Collections.Generic;
using UnityEngine;
using System.IO;
using SQLite4Unity3d;
using System.Linq;

public class DialogEntry
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }

    public string Type { get; set; }
    public string Date { get; set; }
}

public class DatabaseManager : MonoBehaviour
{
    private SQLiteConnection db;

    void Start()
    {
        string dbPath = Path.Combine(Application.persistentDataPath, "dialogDB.db");
        db = new SQLiteConnection(dbPath);
        db.CreateTable<DialogEntry>();
    }

    // 保存对话
    public void SaveDialog(string question, string answer,string type)
    {
        db.Insert(new DialogEntry
        {
            Question = question,
            Answer = answer,
            Type=type,
            Date = System.DateTime.Now.ToString("yyyy-MM-dd")
        });

        Debug.Log("对话已存储到数据库");
    }

    // 读取所有对话
    public List<DialogEntry> LoadDialogHistory()
    {
        return db.Table<DialogEntry>().ToList();
    }

    // 通过 Id 获取单个对话内容
    public DialogEntry GetDialogById(int id)
    {
        return db.Table<DialogEntry>().FirstOrDefault(d => d.Id == id);
    }

    // 删除单个对话
    public void DeleteDialogById(int id)
    {
        var entry = db.Table<DialogEntry>().FirstOrDefault(d => d.Id == id);
        if (entry != null)
        {
            db.Delete(entry);
            Debug.Log($"对话(ID: {id})已删除");
        }
        else
        {
            Debug.LogWarning($"未找到 ID 为 {id} 的对话");
        }
    }
    // 打印所有对话
    public void PrintDialogs()
    {
        List<DialogEntry> history = LoadDialogHistory();
        foreach (var entry in history)
        {
            Debug.Log($"问题: {entry.Question}, 答案: {entry.Answer},来源: {entry.Type}, 日期: {entry.Date}");
        }
    }
}

(7).保存完毕后可以加载和删除对话

public DialogEntry GetDialogById(int id)
    {
        return db.Table<DialogEntry>().FirstOrDefault(d => d.Id == id);
    }

    // 删除单个对话
    public void DeleteDialogById(int id)
    {
        var entry = db.Table<DialogEntry>().FirstOrDefault(d => d.Id == id);
        if (entry != null)
        {
            db.Delete(entry);
            Debug.Log($"对话(ID: {id})已删除");
        }
        else
        {
            Debug.LogWarning($"未找到 ID 为 {id} 的对话");
        }
    }

(8).同样解析后用TMP_Text进行展示

2.接入通义千问文档地址:

QwQ 模型的用法_大模型服务平台百炼(Model Studio)-阿里云帮助中心

(1).需要申请一个API keys,申请地址如下:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

(2).拿到Key后就可以发起请求了

(3).拿到数据后和上面DeepSeek方法一样进行处理。 后续步骤一样,不再赘述。

3.接入豆包,文档地址API文档中心
(1).申请一个Key地址如下:账号登录-火山引擎
(2)拿到Key进行请求:和上面方法一样进行处理。

 4.总结如上,后续会更新OpenAI,有什么问题请留言大家一起讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值