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库

相关推荐
OsDepK23 分钟前
mimo code安装教程
git·电脑·ai编程
Digitally1 小时前
7 种方法将三星S26/S25/S24/S23手机视频传电脑
智能手机·电脑·音视频
Let's Chat Coding1 小时前
身份识别、身份认证与授权的区别
c++
鹏易灵2 小时前
C++——8.移动语义初探(移动构造、移动赋值)
开发语言·c++·php
凯瑟琳.奥古斯特2 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
Alvin's Tech Blog2 小时前
内存泄漏会导致操作系统永久丢失内存吗?它会导致应用程序崩溃吗?
c++·内存管理·内存泄漏
会周易的程序员2 小时前
使用 LuaBridge 封装 C++ 日志库 microLog 为 Lua 模块
c++·物联网·junit·lua·日志·iot·aiot
wbs_scy3 小时前
仿 muduo 高并发服务器项目:从 timerfd 到时间轮实现定时任务机制
linux·服务器·c++
Darkwanderor4 小时前
Linux进程优先级操作
linux·运维·c语言·c++
智者知已应修善业4 小时前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯