来来来,今天再给大家爆料一波。众所周知,deepseek是去年寒假新出火爆的一个AI,所以今年我抽空将这个草稿的类型ai发了出来这篇完全属于硬核文章,由C + +编写
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <regex>
#include <fstream>
#include <utility> // for std::pair
// 1. 包含JSON库(确保json.hpp在项目目录中)
#include "json.hpp"
using json = nlohmann::json;
// 2. 对话管理器:负责记忆与持久化
class DialogueManager {
private:
std::vector<std::pair<std::string, std::string>> m_history;
const std::string m_saveFilename = "dialogue_history.json";
public:
// 构造函数:尝试从文件加载历史记录
DialogueManager() {
loadHistoryFromFile();
}
// 添加一轮对话到内存历史
void addExchange(const std::string& user, const std::string& ai) {
m_history.push_back({user, ai});
// 限制历史记录长度,防止内存无限增长
if (m_history.size() > 10) {
m_history.erase(m_history.begin());
}
}
// 获取当前内存中的历史记录
const std::vector<std::pair<std::string, std::string>>& getHistory() const {
return m_history;
}
// 将历史记录保存到JSON文件
void saveHistoryToFile() const {
json jArray = json::array(); // 创建JSON数组
for (const auto& exchange : m_history) {
json jExchange; // 每个对话回合是一个JSON对象
jExchange["user"] = exchange.first;
jExchange["ai"] = exchange.second;
jArray.push_back(jExchange);
}
std::ofstream file(m_saveFilename);
if (file.is_open()) {
file << jArray.dump(4); // 缩进4个空格,美化输出
std::cout << "[系统] 对话历史已保存至 " << m_saveFilename << std::endl;
} else {
std::cerr << "[错误] 无法打开文件进行写入!" << std::endl;
}
}
// 从JSON文件加载历史记录
void loadHistoryFromFile() {
std::ifstream file(m_saveFilename);
if (!file.is_open()) {
// 文件不存在是正常的第一次运行情况
std::cout << "[系统] 未找到历史存档,将开始新对话。" << std::endl;
return;
}
try {
json jArray;
file >> jArray; // 解析JSON
m_history.clear(); // 清空当前内存中的历史
for (const auto& jExchange : jArray) {
m_history.push_back({jExchange["user"], jExchange["ai"]});
}
std::cout << "[系统] 历史存档已加载,共 " << m_history.size() << " 轮对话。" << std::endl;
} catch (const json::parse_error& e) {
std::cerr << "[警告] 存档文件可能已损坏,将重新开始。错误详情: " << e.what() << std::endl;
m_history.clear();
}
}
// 打印当前对话历史
void printHistory() const {
if (m_history.empty()) {
std::cout << "[历史] 暂无对话记录。" << std::endl;
return;
}
std::cout << "\n======= 对话历史 =======" << std::endl;
int turn = 1;
for (const auto& exchange : m_history) {
std::cout << turn++ << ". 用户: " << exchange.first << "\n AI: " << exchange.second << "\n" << std::endl;
}
std::cout << "========================" << std::endl;
}
};
// 3. 基于规则的对话引擎
class RuleBasedEngine {
private:
std::vector<std::pair<std::regex, std::string>> m_rules;
public:
RuleBasedEngine() {
// 初始化规则库:正则表达式 -> 回复模板
// 注意:C++正则表达式语法与Python略有不同
m_rules = {
{std::regex("(你好|嗨|hello|哈喽)", std::regex::icase), "你好!我是你的C++ AI助手,我们可以聊天,或者谈谈Minecraft。"},
{std::regex("(再见|拜拜|退出|bye)", std::regex::icase), "再见!下次记得问我Minecraft的问题哦!"},
{std::regex(".*(Minecraft|我的世界|MC).*(怎么|如何|怎样).*(合成|制作|造).*(钻石镐|钻石稿)", std::regex::icase),
"钻石镐的合成配方是:在工作台中,最上一排放3颗钻石,中间一排正中和最下一排正中各放1根木棍。它用来挖掘黑曜石等坚硬矿物。"},
{std::regex(".*(Minecraft|我的世界|MC).*(怎么|如何|怎样).*(合成|制作|造).*(工作台| crafting table)", std::regex::icase),
"工作台是Minecraft里最重要的物品之一!用4块任意原木(比如橡木原木)在物品栏的2x2合成格中填满即可合成一个工作台。"},
{std::regex("(你是谁|你叫什么|你是什么)", std::regex::icase), "我是一个用C++编写的规则型对话AI,由一位厉害的小学生开发者研究!"},
{std::regex("(谢谢|多谢|thx)", std::regex::icase), "不客气!随时为你效劳。"}
};
}
// 根据用户输入生成回复
std::string generateResponse(const std::string& userInput) {
for (const auto& rule : m_rules) {
if (std::regex_search(userInput, rule.first)) {
return rule.second; // 匹配第一条规则后返回
}
}
// 默认回复(当没有规则匹配时)
return "这个问题很有趣,但我还在学习如何更好地回答它。你可以尝试问我关于'Minecraft如何合成XX'的问题,或者教我如何回答这个问题!";
}
};
// 4. 主程序框架
int main() {
std::cout << "========================================" << std::endl;
std::cout << " C++ AI 对话框架 (带持久化存档) " << std::endl;
std::cout << "========================================\n" << std::endl;
// 初始化核心组件
DialogueManager dialogueManager;
RuleBasedEngine engine;
// 显示加载的历史记录
dialogueManager.printHistory();
std::string userInput;
bool isRunning = true;
std::cout << "你可以开始对话了(输入'退出'结束程序,输入'历史'查看当前记录):\n" << std::endl;
while (isRunning) {
std::cout << "[用户] ";
std::getline(std::cin, userInput);
// 检查退出命令
if (userInput == "退出" || userInput == "exit") {
isRunning = false;
continue; // 直接进入循环结束,保存历史
}
// 检查历史查看命令
if (userInput == "历史") {
dialogueManager.printHistory();
continue;
}
// 核心流程:生成回复 -> 记录 -> 输出
std::string aiResponse = engine.generateResponse(userInput);
dialogueManager.addExchange(userInput, aiResponse);
std::cout << "[AI] " << aiResponse << std::endl;
}
// 程序结束前,自动保存历史
dialogueManager.saveHistoryToFile();
std::cout << "\n[系统] 程序已退出。下次运行时会自动加载本次对话历史。" << std::endl;
return 0;
}