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库

相关推荐
影视飓风TIM7 小时前
C++ 核心语法进阶:【类和对象终章】从对象拷贝到友元与优化(补上期重载)
c++
小鹏linux7 小时前
鸿蒙PC迁移:Tesseract OCR C++ 三方库鸿蒙适配全记录
c++·ocr·harmonyos
森G7 小时前
65、UDP协议(拓展选学)---------网络编程
网络·c++·qt·网络协议·tcp/ip·udp
WWW65267 小时前
代码随想录 打卡第五十八天
开发语言·c++·算法
herinspace7 小时前
管家婆云辉煌开单优化
服务器·数据库·电脑·管家婆软件·财务软件
少司府7 小时前
C++基础入门:_stack_queue 底层奥秘
开发语言·数据结构·c++·栈和队列·queue·stack
LT10157974448 小时前
2026年开源自动化测试工具选型指南:功能与适用场景解析
测试工具·开源·自动化
开开心心_Every8 小时前
近200个工具的电脑故障修复合集
linux·运维·服务器·leetcode·智能手机·电脑·模拟退火算法
码上有光8 小时前
c++: AVL树
开发语言·c++·avl树
进击的荆棘8 小时前
优选算法——优先级队列
数据结构·c++·算法·leetcode·优先级队列