ai_dialogue_framework项目1.0(纯原创)

来来来,今天再给大家爆料一波。众所周知,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;

}

中间加载着对话系统,这个对话系统各位完全是可以自己更改的,在运行此程序前,大家要在single_include/nlohmann/json.hpp网址上下载json库

相关推荐
挖矿大亨2 小时前
C++中的赋值运算符重载
开发语言·c++·算法
Liu-Eleven3 小时前
Qt/C++开发嵌入式项目日志库选型
开发语言·c++·qt
qq_433554543 小时前
C++区间DP
c++·算法·动态规划
saber_andlibert3 小时前
【C++转GO】文件操作+协程和管道
开发语言·c++·golang
历程里程碑3 小时前
滑动窗口解法:无重复字符最长子串
数据结构·c++·算法·leetcode·职场和发展·eclipse·哈希算法
星火开发设计4 小时前
广度优先搜索(BFS)详解及C++实现
数据结构·c++·算法··bfs·宽度优先·知识
oioihoii4 小时前
C++数据竞争与无锁编程
java·开发语言·c++
dddddppppp1235 小时前
c 模拟一个fat16文件系统
c语言·c++·算法
挖矿大亨5 小时前
C++中左移运算符重载
开发语言·c++