【chatbot-api开源项目】开发文档

chatbot-api

  • 1. 需求分析
    • 1-1. 需求分析
    • 1-2. 系统流程图
  • 2. 技术选型
  • 3. 项目开发
    • 3-1. 项目初始化
    • 3-2. 爬取接口
      • 获取问题接口
      • 回答问题接口
      • 创建对应对象
    • 3-3. 调用AI
    • 3-4. 定时自动化回答
  • 4. Docker部署
  • 5. 扩展
    • 5-1. 如果cookie失效了怎么处理
    • 5-2. 如何更好的对接多个回答系统

Gitee: https://gitee.com/xingyiteng/chatbot-api

1. 需求分析

1-1. 需求分析

  • 调用 AI大模型 自动回答用户的问题。
  • 例如百度知道知乎等用户提问网站。
  • 生活常识情感爱情等问题可以通过 AI大模型 完成回答,从而提升账号等级、赚取积分兑换奖品。

1-2. 系统流程图

在这里插入图片描述

2. 技术选型

  1. SpringBoot
  2. SparkAI
  3. Httpclient
  4. Docker

3. 项目开发

3-1. 项目初始化

  1. 初始化SpringBoot
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.49</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>chatbot-api</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/**</include>
                </includes>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <!--该插件主要用途:构建可执行的JAR -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  1. 创建Gitee仓库

3-2. 爬取接口

获取问题接口

请求地址: https://zhidao.baidu.com/ihome/api/push

请求方式: post

请求参数:

  • pn: 0
  • rn: 20
  • type: newRecommend
  • keyInTag: 1
  • filter:
  • t: 1718528885806
  • tags: 爱情经营 爱情 感情危机 感情
  • isMavin: 0
  • vcode_str:
  • vcode:
  • isAll: 1
  • isExpGroup: 1

请求头:

  • Cookie:xxx
  • Content-Type:application/x-www-form-urlencoded; charset=UTF-8
  • User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

回答问题接口

请求地址: https://zhidao.baidu.com/submit/ajax/

请求方式: post

请求参数:

  • cm: 100009
  • qid: 1616616039139483827
  • title:
  • answerfr:
  • feedback: 0
  • entry: uhome_search_recommend
  • co: 不要过多的顾虑什么,遇到合适的就可以。
  • cite:
  • rich: 1
  • edit: new
  • utdata: 37,0,58,37,59,37,58,37,59,37,58,37,59,37,58,37,59,37,58,37,59,0,60,58,49,57,49,0,56,48,59,57,37,56,57,49,57,17185315609091
  • stoken: 450fdee432f9e1cdad58f99dd1321e0a

请求头:

  • Cookie:xxx
  • Content-Type:application/x-www-form-urlencoded; charset=UTF-8
  • User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

创建对应对象

  • 根据接口的返回JSON格式,转换成对应的对象
  • 转换网站:http://www.esjson.com/jsontopojo.html

3-3. 调用AI

  • 调用星火Spark模型
  • https://github.com/briqt/xunfei-spark4j

3-4. 定时自动化回答

  • 设置随机打烊,防止风控
@Scheduled(fixedDelay = 5000)
    public void run(){
        try {
            if (new Random().nextBoolean()) {
                logger.info("\n随机打烊中...");
                return;
            }

            // 获取问题
            List<QidAndQuestion> list = zhidao.queryQuestions();
            if (list.isEmpty()) {
                logger.info("\n本次未检索到问题...");
                return;
            }

            // 遍历问题
            for (QidAndQuestion qidAndQuestion : list) {
                String qid = qidAndQuestion.getqId();
                String question = qidAndQuestion.getQuestion();

                // 调用模型
                String answer = yuModelAI.doChat(question);

                // 回答问题
                boolean status = zhidao.answer(qid, answer);
                logger.info("\nqId: {}\n问题: {}\n回答: {}\n回答状态: {}", qid, question, answer, status);

                // 生成一个3到7秒之间的随机数(毫秒)
                int randomSleepTime = ThreadLocalRandom.current().nextInt(3000, 7001);
                logger.info("\nAI随机休息:{}s", randomSleepTime / 1000);
                Thread.sleep(randomSleepTime);
            }
        } catch (InterruptedException e) {
            logger.error("自动回答异常", e);
	}
}

4. Docker部署

视频:https://www.bilibili.com/video/BV13L411C7FU/

# 基础镜像
FROM openjdk:8-jre-slim

# 设置环境变量TZ
ENV TZ=Asia/Shanghai

# 配置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 添加应用
ADD /target/chatbot-api.jar /chatbot-api.jar

CMD ["java", "-jar", "chatbot-api.jar"]

EXPOSE 8090

5. 扩展

5-1. 如果cookie失效了怎么处理

5-2. 如何更好的对接多个回答系统

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web渗透信息收集进阶

网站敏感目录与文件 网站敏感目录表示网站目录中容易被恶意人员利用的一些目录。通常恶意人员都是通过工具扫描&#xff0c;来扫出网站的敏感目录&#xff0c;敏感目录是能够得到其他网页的信息&#xff0c;从而找到后台管理页面&#xff0c;尝试进入后台等&#xff0c;扫描网…

在Ubuntu中创建Ruby on Rails项目并搭建数据库

新建Rails项目 先安装bundle Ruby gem依赖项工具&#xff1a; sudo apt install bundle 安装Node.js: sudo apt install nodejs 安装npm 包管理器&#xff1a; sudo apt install npm 安装yarn JavaScript包管理工具&#xff1a; sudo apt install yarn 安装webpacker: …

leetcode236. 二叉树的最近公共祖先

一、题目描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 二、输入输出实例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [3,5,1,6,2,0,8,null,null,7,4], p 5, q 1 输出&#xff1a;3 解释&#xff1a;节点 5 和节点 1 的最近公共祖先…

Ps:脚本事件管理器

Ps菜单&#xff1a;文件/脚本/脚本事件管理器 Scripts/Script Events Manager 脚本事件管理器 Script Events Manager允许用户将特定的事件&#xff08;如打开、存储或导出文件&#xff09;与 JavaScript 脚本或 Photoshop 动作关联起来&#xff0c;以便在这些事件发生时自动触…

按键输入消抖

按键输入是人机对话不可缺少的一部分&#xff0c;对于消抖设计&#xff0c;一种是软件消抖&#xff0c;一种是硬件消抖。但在单片机电路设计中&#xff0c;采用电容消抖才是最佳的选择&#xff0c;其次才是定时器消抖。 1、按键输入采用软件消抖 1)、通过定时器方式定时读取按…

【Android面试八股文】请你描述一下JVM的内存模型

文章目录 JVM内存模型1. 方法区(Method Area)运行时常量池(Runtime Constant Pool)2. 堆(Heap)3. 栈(Stack)4. 本地方法栈(Native Method Stack)5. 程序计数器(Program Counter Register)6. 直接内存(Direct Memory)JVM内存溢出的情况Java的口号是: “Write onc…

生产者消费者模型的同步与互斥:C++代码实现

文章目录 一、引言二、生产者消费者模型概述1、基本概念和核心思想2、生产者消费者模型的优点 三、消费者和生产者之间的同步与互斥四、代码实现1、事前准备2、环形队列的实现3、阻塞队列的实现4、两种实现方式的区别 一、引言 在现代计算机系统中&#xff0c;很多任务需要同时…

稀疏矩阵是什么 如何求

稀疏矩阵是一种特殊类型的矩阵&#xff0c;其中大多数元素都是零。由于稀疏矩阵中非零元素的数量远少于零元素&#xff0c;因此可以使用特定的数据结构和算法来高效地存储和处理它们&#xff0c;从而节省存储空间和计算时间。 RowPtr 数组中的每个元素表示对应行的第一个非零元…

FreeRTOS队列(queue)

队列(queue)可以用于"任务到任务"、 "任务到中断"、 "中断到任务"直接传输信息。 1、队列的特性 1、1常规操作 队列的简化操如下图所示&#xff0c;从此图可知&#xff1a; 队列中可以包含若干数据&#xff1a;队列中有若干项&#xff0c;这…

PostgreSql中使用to_char函数、date()函数可能会导致索引无法充分利用,导致查询速度无法提升

今天在处理接口请求速度慢的问题&#xff0c;惊奇的发现加了索引&#xff0c;但还是请求很忙。由于card_stop_info表有300w条数据&#xff0c;这时候关联查询非常慢&#xff0c;于是我加上匹配项索引&#xff0c;但是发现依然没有改变速度。。这时候去搜了一下才知道pgsql的to_…

javaweb 期末复习

1. JDBC数据库连接的实现逻辑与步骤以及JDBC连接配置&#xff08;单列模式&#xff09; public class JDBCUtil {// 这些换成自己的数据库 private static final String DB_URL "jdbc:mysql://localhost:3306/你的数据库名称";private static final String USER &q…

辛弃疾,笔墨剑影的一生

辛弃疾&#xff0c;字幼安&#xff0c;号稼轩&#xff0c;生于南宋高宗赵构绍兴十年&#xff08;公元1140年&#xff09;&#xff0c;卒于南宋宁宗赵扩嘉泰元年&#xff08;公元1207年&#xff09;&#xff0c;享年67岁。他是中国南宋时期著名的爱国词人&#xff0c;与苏轼并称…

Unity贪吃蛇改编【详细版】

Big and small greedy snakes 游戏概述 游戏亮点 通过对称的美感&#xff0c;设置两条贪吃蛇吧&#xff0c;其中一条加倍成长以及加倍减少&#xff0c;另一条正常成长以及减少&#xff0c;最终实现两条蛇对整个界面的霸占效果。 过程中不断记录两条蛇的得分情况&#xff0c…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 部门项目任务分配(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 部门项目任务分配(100分) 🌍 评测功能需要订阅专栏后私信联…

【eMTC】eMTC PBCH与LTE PBCH有什么不同

1 概述 eMTC是基于LTE演进的物联网技术&#xff0c;在R12中叫Low-Cost MTC&#xff0c;在R13中被称为LTE enhanced MTC &#xff0c;即eMTC&#xff0c;旨在基于现有的LTE载波满足物联网设备需求。eMTC基于蜂窝网络进行部署&#xff0c;支持上下行最大1Mbps的峰值速率&#xff…

lxml库在爬虫领域的贡献及应用

重头戏lxml库里面的xpath 一段代码给各位开开胃 这段代码首先导入了lxml库中的etree模块&#xff0c;然后定义了一个包含HTML内容的字符串html。接着&#xff0c;我们使用etree.HTML()函数解析这个HTML字符串&#xff0c;得到一个表示整个HTML文档的树形结构。最后&#xff0c;…

《大数据分析》期末考试整理

一、单项选择题&#xff08;1*9&#xff09; 1.大数据发展历程&#xff1a;出现阶段、热门阶段和应用阶段 P2 2.大数据影响 P3 1&#xff09;大数据对科学活动的影响 2&#xff09;大数据对思维方式的影响 3&#xff09;大数据对社会发展的影响 4&#xff09;大数…

C语言---------深入理解指针

目录 一、字符指针 二、指针数组&#xff1a; 三、数组指针&#xff1a; 1、定义&#xff1a; 2、&数组名和数组名区别&#xff1a; 3、数组指针的使用&#xff1a; 四、数组参数&#xff0c;指针参数&#xff1a; 1、一维数组传参&#xff1a; 2、二维数组传参&am…

单列集合顶层接口Collection及五类遍历方式(迭代器)

collection add方法细节&#xff1a; remove方法细节&#xff1a; contains方法细节&#xff1a; 如果集合中存储的是自定义对象, student之类的, 也想通过contains进行判断, 就必须在javaBean中重写equals方法 contains在arrayList中源代码&#xff1a;在底层调用了equals方…

对候选人得票的统计程序

一个结构体变量中可以存放一组数据&#xff08;如一个学生的学号、姓名、成绩等数据&#xff09;。如果有10个学生的数据需要参加运算&#xff0c;显然应该用数组&#xff0c;这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于&#xff1a;每个数组元素都是一…