在IM即時(shí)通訊系統(tǒng)中接入DeepSeek等AI大模型
隨著DeepSeek的熱潮,越來越多的企業(yè)也開始部署并訓(xùn)練自己的AI大模型,這樣能使企業(yè)以前沉淀的專業(yè)知識(shí)和經(jīng)驗(yàn)?zāi)芨咝У乇焕闷饋怼S锌蛻舴答伭诉@樣的需求場(chǎng)景:客戶私有部署了自己的AI大模型以及私有化部署自己的內(nèi)部即時(shí)通訊系統(tǒng),他們希望可以在即時(shí)通訊的聊天界面中,直接和AI大模型對(duì)話,就像和同事對(duì)話一樣,這將大大提升工作效率。所以,我們決定在 傲瑞通(OrayTalk) 中接入DeepSeek等AI大模型,來滿足這一需求。
那么具體如何實(shí)現(xiàn)了?
1. 客戶端UI實(shí)現(xiàn)
首先,傲瑞通客戶端新增了與AI大模型對(duì)話的UI入口:

在我的好友中,有一個(gè)“AI智能體”,點(diǎn)擊它,就可以和AI大模型進(jìn)行對(duì)話了。
其次,傲瑞通客戶端也提供了查詢與AI對(duì)話的歷史記錄:

點(diǎn)擊對(duì)話記錄中的問題,會(huì)彈出新窗口顯示問題的答案。

2. 數(shù)據(jù)庫實(shí)現(xiàn)
數(shù)據(jù)庫中增加AIChatRecord表,用于存儲(chǔ)與AI的對(duì)話記錄。
AIChatRecord 表的創(chuàng)建腳本如下所示:
CREATE TABLE [dbo].AIChatRecord(
[GUID] [nvarchar](50) NOT NULL,
[UserID] [nvarchar](50) NOT NULL,
[ModelType] [int] NOT NULL,
[Question] [nvarchar](max) NOT NULL,
[Attachments] [nvarchar](1000) NOT NULL,
[Answer] [nvarchar](max) NOT NULL,
[ProcessResult] [int] NOT NULL,
[ErrorMessage] [nvarchar](max) NOT NULL,
[CreateTime] [datetime] NOT NULL,
CONSTRAINT [PK_AIChatRecord] PRIMARY KEY CLUSTERED
(
[GUID] ASC
)
AIChatRecord 表中幾個(gè)關(guān)鍵字段的含義如下所示:
(1)ModelType:用于記錄所采用的大模型類型,比如DeepSeek、通義千問、文心一言 等等。
(2)Question:記錄所提問的問題。
(3)Attachments:表示該問題所涉及的附件的URL,如圖片或文件的URL。
(4)ProcessResult:表示問題的處理結(jié)果。0表示成功,其它值表示不同類型的錯(cuò)誤,如超時(shí)、API調(diào)用報(bào)錯(cuò)等。
(5)ErrorMessage:如果有報(bào)錯(cuò),ErrorMessage字段記錄了具體的錯(cuò)誤信息。
(6)Answer:AI給出的問題的答案。只有當(dāng)ProcessResult為0時(shí),該值才有效。
3. 服務(wù)端對(duì)接AI大模型
傲瑞通服務(wù)端實(shí)現(xiàn)了與私有部署的大模型(如DeepSeek、通義千問等)的對(duì)接。
使用C#調(diào)用DeepSeek 的API是相當(dāng)簡(jiǎn)單的,示例如下所示:
class DeepSeekApiClient { private readonly string _apiKey; private readonly HttpClient _httpClient; // 構(gòu)造函數(shù),傳入你的API密鑰 public DeepSeekApiClient(string apiKey) { _apiKey = apiKey; _httpClient = new HttpClient(); // 設(shè)置基礎(chǔ)URL(根據(jù)DeepSeek API文檔調(diào)整) _httpClient.BaseAddress = new Uri("https://api.deepseek.com/v1/"); // 設(shè)置授權(quán)頭 _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}"); } // 發(fā)送聊天請(qǐng)求的異步方法 public async Task<string> SendChatRequestAsync(string prompt) { try { // 構(gòu)造請(qǐng)求體 var requestBody = new { model = "deepseek-chat", // 根據(jù)API文檔調(diào)整模型名稱 messages = new[] { new { role = "user", content = prompt } }, temperature = 0.7, max_tokens = 1000 }; // 序列化為JSON var json = JsonSerializer.Serialize(requestBody); var content = new StringContent(json, Encoding.UTF8, "application/json"); // 發(fā)送POST請(qǐng)求 var response = await _httpClient.PostAsync("chat/completions", content); // 確保請(qǐng)求成功 response.EnsureSuccessStatusCode(); // 讀取并返回響應(yīng)內(nèi)容 var responseContent = await response.Content.ReadAsStringAsync(); return responseContent; } catch (Exception ex) { Console.WriteLine($"Error calling DeepSeek API: {ex.Message}"); throw; } } }
服務(wù)端的主要業(yè)務(wù)邏輯如下:
(1)當(dāng)服務(wù)端收到來自客戶端的AI提問時(shí),便在DB中插入一條記錄,該記錄的ProcessResult字段的值是“處理中”,然后將該問題通過上面的DeepSeekApiClient提交給AI大模型,并等待回復(fù)。
(2)當(dāng)服務(wù)端收到了AI大模型的回復(fù)(或超時(shí)、或報(bào)錯(cuò))后,再更新DB中對(duì)應(yīng)的那條記錄的ProcessResult、Answer等字段的值。接著,再將AI回復(fù)發(fā)送給客戶端。
(3)特殊情況處理:比如,當(dāng)在等待大模型回復(fù)期間,如果客戶端掉線了的情況。
到這里,在傲瑞通中集成DeepSeek等AI大模型的工作就完成了,有興趣的朋友歡迎留言多多交流!

浙公網(wǎng)安備 33010602011771號(hào)