php开发聊天 接入deepseek

news/2025/2/28 0:55:25/文章来源:https://www.cnblogs.com/e0yu/p/18742397

用魔法打败魔法,通过Deepseek生成代码,最终功能实现了:

第一个问题:php开发聊天 接入deepseek(摘抄一些核心代码)

1、安装

composer require deepseek-php/deepseek-php-client  # 示例命令‌:ml-citation{ref="4" data="citationList"}

2、创建DeepSeek客户端实例

use DeepSeek\DeepSeekClient;  # 若使用官方库‌:ml-citation{ref="4" data="citationList"}
$apiKey = 'YOUR_API_KEY';     # 从环境变量或安全存储读取‌:ml-citation{ref="2,3" data="citationList"}
$client = DeepSeekClient::build($apiKey);  # 官方客户端初始化‌:ml-citation{ref="4" data="citationList"}

3、发送对话请求

$postData = ['model' => 'deepseek-chat',  'messages' => [['role' => 'system', 'content' => '你是一个助手'],  ['role' => 'user', 'content' => '你好']  ],'temperature' => 1,'max_tokens' => 2048,'stream' => false  # 非流式模式‌:ml-citation{ref="1,5" data="citationList"}
];
$response = $client->chatCompletions($postData);  # 调用方法‌:ml-citation{ref="5" data="citationList"}

 4、处理响应

if ($response) {$result = json_decode($response, true);$reply = $result['choices']['message']['content'];echo $reply;  # 输出回复内容‌:ml-citation{ref="5,6" data="citationList"}
}

5、启用流输出:

$postData['stream'] = true;
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {echo $data;  # 实时输出流数据return strlen($data);
});  # 需自行实现 cURL 流处理‌:ml-citation{ref="1,7" data="citationList"}

6、保存对话记录

file_put_contents('conversation.txt', json_encode($postData) . PHP_EOL, FILE_APPEND);  # 结构化存储‌:ml-citation{ref="1" data="citationList"}

8、错误处理

if (curl_errno($ch)) {error_log('cURL Error: ' . curl_error($ch));  # 记录错误日志‌:ml-citation{ref="3" data="citationList"}
}

第一个问题,给出来的都不是具体的代码,都是一些代码片段。

然后问第二个问题:提供一个完整的PHP接入DeepSeek聊天示例

1、基础代码结构

<?php
class DeepSeekChat {private $apiUrl = 'https://api.siliconflow.cn/v1/chat/completions';private $apiKey;  // 从环境变量获取‌:ml-citation{ref="1,3" data="citationList"}private $logFile = 'conversation.log';public function __construct() {$this->apiKey = getenv('DEEPSEEK_API_KEY');  // 安全读取密钥‌:ml-citation{ref="1,5" data="citationList"}if (!file_exists($this->logFile)) {touch($this->logFile);}}public function sendMessage($message, $history = []) {$messages = array_merge([['role' => 'system', 'content' => '你是有道AI助手']],$history,[['role' => 'user', 'content' => $message]]);$postData = ['model' => 'deepseek-chat','messages' => $messages,'temperature' => 1,'max_tokens' => 2048,'stream' => false];return $this->executeRequest($postData);}private function executeRequest($data) {$ch = curl_init();curl_setopt_array($ch, [CURLOPT_URL => $this->apiUrl,CURLOPT_HTTPHEADER => ['Content-Type: application/json','Authorization: Bearer ' . $this->apiKey],CURLOPT_POST => true,CURLOPT_POSTFIELDS => json_encode($data),CURLOPT_RETURNTRANSFER => true,CURLOPT_SSL_VERIFYPEER => true  // 生产环境强制验证‌:ml-citation{ref="3,5" data="citationList"}
        ]);$response = curl_exec($ch);$this->logConversation($data, $response);if (curl_errno($ch)) {throw new Exception('API请求失败: ' . curl_error($ch));}return $this->parseResponse($response);}private function parseResponse($response) {$result = json_decode($response, true);if (isset($result['choices']['message']['content'])) {return $result['choices']['message']['content'];}throw new Exception('API响应解析失败');}private function logConversation($request, $response) {$logEntry = json_encode(['timestamp' => date('Y-m-d H:i:s'),'request' => $request,'response' => json_decode($response, true)]) . PHP_EOL;file_put_contents($this->logFile, $logEntry, FILE_APPEND);}
}// 使用示例
$chat = new DeepSeekChat();
try {$reply = $chat->sendMessage("PHP如何接入DeepSeek?");echo "AI回复: " . $reply;
} catch (Exception $e) {echo "错误: " . $e->getMessage();
}
?>

这个代码,直接可以用,就很厉害!

2、流式响应拓展方案

在executeRequest 方法中增加流式处理:

public function streamMessage($message) {$postData = $this->buildRequestData($message);$postData['stream'] = true;  // 启用流式传输‌:ml-citation{ref="1,3" data="citationList"}$ch = curl_init();// ... 初始化配置同上curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {$lines = explode("\n", $data);foreach ($lines as $line) {if (strpos($line, 'data: ') === 0) {$json = substr($line, 6);$response = json_decode($json, true);if (isset($response['choices']['delta']['content'])) {echo $response['choices']['delta']['content'];flush();}}}return strlen($data);});curl_exec($ch);
}

3、错误监控

// 在构造函数中增加监控
set_error_handler(function($errno, $errstr) {error_log("DeepSeek Error: $errstr");
});

两个问题其实已经给出了答案了。

第三个问题:给我 流式响应扩展方案 的详细代码示例

class DeepSeekChat {// ... 保留原有属性和构造函数/*** 流式对话处理(支持上下文延续)* @param string $message 用户输入* @param array $history 对话历史(格式:[['role'=>'user', 'content'=>'内容'],...])*/public function streamMessage(string $message, array $history = []) {$messages = array_merge([['role' => 'system', 'content' => '你是有道AI助手']],$history,[['role' => 'user', 'content' => $message]]);$postData = ['model' => 'deepseek-chat','messages' => $messages,'temperature' => 1,'max_tokens' => 2048,'stream' => true  // 启用流式模式‌:ml-citation{ref="1,3" data="citationList"}
        ];$this->executeStreamRequest($postData);}private function executeStreamRequest(array $data) {$ch = curl_init();try {curl_setopt_array($ch, [CURLOPT_URL => $this->apiUrl,CURLOPT_HTTPHEADER => ['Content-Type: application/json','Authorization: Bearer ' . $this->apiKey],CURLOPT_POST => true,CURLOPT_POSTFIELDS => json_encode($data),CURLOPT_WRITEFUNCTION => function($ch, $data) {$this->processStreamChunk($data);  // 处理数据块return strlen($data);},CURLOPT_SSL_VERIFYPEER => true,  // 强制SSL验证‌:ml-citation{ref="5" data="citationList"}CURLOPT_TIMEOUT => 120  // 超时设置‌:ml-citation{ref="3" data="citationList"}
            ]);if (!curl_exec($ch) && curl_errno($ch)) {throw new Exception('流式请求失败: ' . curl_error($ch));}} finally {curl_close($ch);  // 确保释放资源‌:ml-citation{ref="3" data="citationList"}
        }}private function processStreamChunk(string $chunk) {$lines = explode("\n", trim($chunk));foreach ($lines as $line) {if (strpos($line, 'data: ') === 0) {  // 识别有效数据行‌:ml-citation{ref="6" data="citationList"}$jsonStr = substr($line, 6);if ($jsonStr === '[DONE]') return;  // 流结束标记‌:ml-citation{ref="3" data="citationList"}$response = json_decode($jsonStr, true);if (isset($response['choices']['delta']['content'])) {echo $response['choices']['delta']['content'];flush();  // 实时输出缓冲区‌:ml-citation{ref="1" data="citationList"}
                }}}}
}

使用示例:

// 初始化对话
$chat = new DeepSeekChat();// 执行流式请求
try {header('Content-Type: text/plain; charset=utf-8');  // 设置HTTP流头‌:ml-citation{ref="3" data="citationList"}$chat->streamMessage("用PHP实现快速排序算法");
} catch (Exception $e) {error_log("流式错误: " . $e->getMessage());  // 错误日志记录‌:ml-citation{ref="5" data="citationList"}
}

到此,功能基本就全部实现了。

打完收工!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CodeForces训练记录】Educational Codeforces Round 175 (Rated for Div. 2)

训练情况赛后反思 CD连续卡题,D题树上层序遍历+加法原理,鉴定为基本的图论数据结构没学好 A题 直接打表,对于 i%3 = i%5 的情况,我们发现有三个一组,三个一组连续的数,每组第一个数之间差 15,所以我们 / 15 * 3 先把整组的数量算出来,再求是组内第几个,就能得到答案了…

软工五问

这个作业属于哪个课程 课程链接这个作业要求在哪里 作业要求这个作业的目标 学习使用markdown, 接触GitHub, 建立个人博客个人介绍 📋标签 广东湛江 人 期望成为 golang后端工程师 学习经历持续学习golang及其框架, 设计模式 持续学习后端各个组件的可靠高效解决方案兴趣爱好…

清华大学推出的5册免费的 DeepSeek 学习使用指南!

前言 在当今这个信息洪流、技术飞速迭代的时代,DeepSeek的横空出世极大地降低了普通人利用人工智能技术的门槛。然而,尽管机遇就在眼前,仍有不少朋友面对DeepSeek感到无从下手,不知如何利用它来紧握时代赋予的红利。对此,清华大学展现出了高度的社会责任感与前瞻性,推出了…

拆解分析行业头部米家绿米燃气报警器怎么样?

小米绿米天然气卫士拆解,内置Zigbee模组,需要连接Zigbee 3.0网关 或者 具备Zigbee 3.0网关功能的设备报警 天然气是每家每户日常生活中都会使用到的清洁能源,因此对于天然气的安全防护时刻不能放松。小米天然气卫士是小米与业内知名品牌 赛特威尔 联手打造的一款产品,可探测…

C++ DLL 供 C# AnyCPU 调用 【 OpenCV onnxruntime】

背景 C++ 打包的DLL用到 OpenCV,用到 onnxruntime C# 软件需要打包成Any CPU版本,即可以在 x86下使用,也可以在x64下使用 C# 前端想把 C++ dll与依赖放在单独的”Libs“文件夹中,不是"Dubug"下 难点: 在C++ 中, OpenCV 和 onnxruntime 分别有x64和x86两个版本,…

Mac本地部署DeepSeek(简洁版)

1. 下载ollama2. 安装ollma 无脑安装那么最小的1.5b模型就拥有15亿的参数量,而最大的671b则有6710亿个参数,我们要使用的是前面这6个规模较小的模型。ollama run deepseek-r1:8b要等一会我不相信黑夜将至 因为火把就在我的手中。

使用OpenLPA编辑eUICC卡片

使用OpenLPA编辑eUICC卡片原文地址: [https://github.com/EsimMoe/MiniLPA/blob/main/README_zh-CN.md] 原作者:EsimMoe 许可: AGPL-3.0 license精美的现代化 LPA UI特性良好的跨平台支持 (Windows, Linux, macOS) 更友好的用户界面 i18n 多语言支持 搜索与快捷跳转 自由地管理…

UltraRAG 框架全家桶

转载:清华等团队推出 UltraRAG 框架全家桶,让大模型读懂善用知识库!引言 RAG 系统的搭建与优化是一项庞大且复杂的系统工程,通常需要兼顾测试制定、检索调优、模型调优等关键环节,繁琐的工作流程往往让人无从下手。 近日,针对以上痛点,清华大学 THUNLP 团队联合东北大学…

2024/2/27日 日志 第一次测试案例分析(4)--登录与注册和仓库方面

UserMapper点击查看代码 package com.Moonbeams.mapper;import com.Moonbeams.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotation…

基于Web的图书管理系统全面解析与实践指南

@目录一、项目背景与目标二、技术选型与开发工具(一)后端技术:Java 与 Servlet(二)前端技术:HTML、CSS 与 JavaScript(三)数据库:MySQL(四)开发工具:Eclipse三、系统架构设计(一)表示层(二)业务逻辑层(三)数据访问层四、功能模块详解(一)用户角色与权限管理…

Juniper SRX1500 防火墙 Internet与SDWAN分流配置

Chassis 管理接口fxp0 大多数SRX设备都有独立的管理接口,名称为fxp0。 低端一些的设备,比如SRX300/320是没有独立的fxp0的。 需要从接口中挑一个作为管理接口。 Interface Renumbering Juniper的堆叠叫Chassis, 堆叠的节点分别叫node0和node1。 堆叠建立以后, 在查看配置的…

逆向软件设计和开发

在软件技术迅猛发展的今天,逆向工程已成为理解、分析和改进现有软件系统的重要手段。旨在深入剖析目标软件的内部结构、功能逻辑和数据流,为软件维护、安全评估和功能扩展提供可靠依据。 在本次实验中,本人基于同学提供的一份C++课程设计的员工信息管理系统进行逆向工程开发…