ChatGPT实战-构建文章分析AI聊天机器人

视频版本:

ChatGPT实战-构建文章分析AI聊天机器人

简介

本文实现如下功能:

当浏览一篇文章,点击分享,分享到聊天软件的对话框中。它就会生成一个文章的总结和分析结果。例如分析是否有逻辑问题,是否有诱导购买,是否有焦虑制造。

一起来看看怎么实现的吧。

这里以飞书机器人为例,当然你也可以用别的平台,例如微信、钉钉。

整体方案介绍

方案

  1. 首先,用户将文章链接发送给飞书聊天机器人;
  2. 飞书通过事件订阅将内容发给机器人服务端;
  3. 服务端收到链接后访问网址获取内容,并调用chatgpt接口进行总结;
  4. 将总结后的内容回复给用户。

下面我们来一步步实现。

前置准备

在开始之,你需要准备好ChatGPT的API访问key和一台web服务器。

准备web服务器的时候,需要注意安全问题。例如服务器关闭root登录,禁止密码登录。采用ssh key的方式进行登录。

然后防火墙需要在云厂商的控制台开启。不然外部无法访问。

代码

在github中也可以找到:shanchuantian/paper_analyze_bot.git
有三个文件,入口在main.py中。
main.py

import json
import uuidimport requests
from fastapi import FastAPI
from fastapi.params import Body
from fastapi import BackgroundTasksfrom openai import chat
from parse_wexin_paper import get_paper_contentapp = FastAPI()@app.get("/")
def root():return {"message": "Hello World"}def get_tenant_access_token():url = 'https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal'body = {"app_id": "cli_xxx",  # todo 可以将其放入环境变量中,不能泄漏!!!!"app_secret": "jwxxx"  # todo 可以将其放入环境变量中,不能泄漏!!!!}res = requests.post(url, json=body)return res.json().get('tenant_access_token')def send_response(message_id, text_content):# 回复消息url = f'https://open.feishu.cn/open-apis/im/v1/messages/{message_id}/reply'res_content = {"text": text_content}response = {"content": json.dumps(res_content),"msg_type": "text","uuid": str(uuid.uuid4())}token = get_tenant_access_token()headers = {'Authorization': f'Bearer {token}','Content-Type': f'application/json; charset=utf-8'}print(f'response url:{url}, header:{headers}, data:{response}')requests.post(url, headers=headers, json=response)def handle_task(payload):# 用户发过来的消息content = payload.get('event').get('message').get('content')print(f'content:{content}')# 获取文章内容paper_content = get_paper_content(json.loads(content).get('text'))prompt = f"""我会给你一篇由<<begin>>和<<end>>包含的文章,请完成如下任务:1.总结一下文章,以列表的形式输出关键要点,保持语句通顺,简单易懂。2.分析文章中是否有逻辑问题,如果有请依次列出问题,写在下面的【逻辑问题列表】中,没有则保持空。3.分析文章中是否有诱导读者购买课程、商品等行为,如果有请写在下面的【诱导购买列表】中,没有则保持空。4.分析文章中是否有焦虑制造倾向,如果有请写在下面的【焦虑制造列表】中,没有则保持空。严格按照如下格式输出:【总结】这里放总结内容。【逻辑问题列表】在这里列出逻辑问题。【诱导购买列表】在这里列出诱导购买内容。【焦虑制造列表】在这里放焦虑制造内容。这是文章:<<begin>>{paper_content}<<end>>"""print(f'prompt:{prompt}')# 调用ChatGPT进行总结summary = chat(prompt)message_id = payload.get('event').get('message').get('message_id')# 回复消息send_response(message_id, summary)@app.post("/")
async def say_hello(background_tasks: BackgroundTasks, payload: dict = Body(...)):# 检测到CHALLENGE标记就直接返回,以通过飞书的接入challenge = payload.get('CHALLENGE')if challenge:print(f'CHALLENGE flag is exist, return it.')return payload# print(f'payload:{json.dumps(payload)}')# feishu要求1秒内返回,所以此处起一个后台任务处理background_tasks.add_task(handle_task, payload)print('###### i will return immediately。。。')return ''if __name__ == '__main__':get_tenant_access_token()

openai.py

import requestsurl = "https://openai.api2d.net/v1/chat/completions"headers = {'Content-Type': 'application/json',# todo 不能泄漏'Authorization': 'Bearer fkxxx' # <-- 把 fkxxxxx 替换成你自己的 Forward Key,注意前面的 Bearer 要保留,并且和 Key 中间有一个空格。
}def chat(content, role='user', model='gpt-3.5-turbo'):data = {"model": model,"messages": [{"role": role, "content": content}]}print('start chat to chatgpt....')response = requests.post(url, headers=headers, json=data)print("ChatGPT Status Code", response.status_code)print("ChatGPT JSON Response ", response.json())return response.json().get('choices')[0].get('message').get('content')if __name__ == '__main__':content = '你好'chat(content=content)

parse_wexin_paper.py

import requests
from lxml import etree
import osdef get_paper_content(url):html = requests.get(url).text# print(f'html:{html}')con = etree.HTML(html)# 获取标题h2 = con.xpath('//h1[@class="rich_media_title "]/text()')h2 = ",".join(map(str, h2))h2 = os.linesep.join([s for s in h2.splitlines(True) if s.strip()])h2 = h2.rstrip()  # 去除右空行print(f'h2:{h2}')# print(h2)# 获取正文p_text = ''span = con.xpath('//p | //section/span')  # 通过‘|’可以增加筛选的条件print(f'span:{span}')# print(span)for p_tex in span:p_tex = p_tex.xpath('string(.)')p_text = p_text + p_tex + '\n'# print(p_tex)# print(p_text)# 保存内容con_text = '%s%s%s%s' % (h2, '\n', p_text, '\n')return con_textif __name__ == '__main__':# url = input("请输入要采集的微信公众号文章地址:")url = "https://mp.weixin.qq.com/s/xxx"get_paper_content(url)

我们通过fast API这个web框架来实现web服务。在这里我们需要实现两个功能:

一个是接入服务功能,另一个是我们的业务逻辑。

运行服务可以直接通过uvicorn 运行:

uvicorn main:app --host 0.0.0.0 --port 7011

飞书权限申请

主要是在飞书开放平台申请应用,然后添加权限,事件订阅发布版本。(截图太多了,上面视频中有详细介绍)

接下来就可以愉快的进行使用啦。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fiddler 八个实用技巧

大家对Fiddler应该不会陌生&#xff0c;但里面有些技巧不见得都会&#xff0c;这里就有八个实用技巧&#xff0c;通过对Fiddler的定制&#xff0c;能提高大家的测试效率。 1、双击Session时&#xff0c;使响应页始终显示到”json”tab页&#xff1b;使请求页始终显示到“webfo…

【操作系统】聊聊什么是CPU上下文切换

对于linux来说&#xff0c;本身就是一个多任务运行的操作系统&#xff0c;运行远大于CPU核心数的程序&#xff0c;从用户视角来看是并发执行&#xff0c;而在CPU视角看其实是将不同的CPU时间片进行分割&#xff0c;每个程序执行一下&#xff0c;就切换到别的程序执行。那么这个…

Controller统一异常处理和yaml配置

目录 Controller统一异常处理 url解析 static下静态资源文件的访问 配置类 如何访问static下的资源文件 yaml基础语法 注解赋值 批量注入 单个注入 Controller统一异常处理 Controller统一异常处理ControllerAdvice&#xff1a;统一为Controller进行"增强" …

(Clock Domain Crossing)跨时钟域信号的处理 (自我总结)

CummingsSNUG2008Boston_CDC.pdf 参考&#xff1a; 跨时钟域处理方法总结–最终详尽版 - love小酒窝 - 博客园 跨时钟域&#xff08;CDC&#xff09;设计方法之单bit信号篇&#xff08;一&#xff09; | 电子创新网赛灵思社区 孤独的单刀_Verilog语法,FPGA设计与调试,FPGA接口与…

LVGL移植win端模拟显示流畅解决方案-使用 SquareLine 生成前端 UI 文件

lvgl_port_win_vscode 在 win 平台对 lvgl 方便的进行模拟显示&#xff0c;程序文件结构清晰&#xff0c;lvgl with SDL2&#xff0c;cmake 构建&#xff0c;VsCode 一键运行&#xff0c;使用 SquareLine 生成前端 UI 文件&#xff0c;win 上直接跑。 相比官方的 lvgl 移植到…

Redis 集合(Set)快速指南 | Navicat

Redis 支持通过多种数据类型来存储项目集合。其中&#xff0c;包括列表、集合和哈希。上周的博文介绍了列表&#xff08;List&#xff09;数据类型并重点介绍了一些用于管理列表&#xff08;List&#xff09;的主要命令。在今天的文章中&#xff0c;我们将转向关注集合&#xf…

【MySQL基础】--- 约束

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、什么…

Python 打印文本进度条

""" 打印文本进度条知识点&#xff1a;1、字符串运算&#xff0c;注意只能适用于加法、乘法&#xff0c;例如&#xff1a;123 123 123123例如&#xff1a;123 * 3 1231231232、循环语句while、for3、条件语句if4、重点&#xff1a;转义字符\r&#xff0c;可以…

【springMvc】自定义注解的使用方式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 1.前言 1.1.什么是注解 Annontation是Java5开始引入的新特征&#xff0c;中文名称叫注解。 它提供了一种安全…

Unity中UI组件对Shader调色

文章目录 前言一、原理在Shader中直接暴露的Color属性&#xff0c;不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色&#xff0c;如果需要在修改组件中的颜色时&#xff0c;使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点…

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找 所谓的查找或搜索&#xff0c;指从一组数据对象中找出符合特定条件者&#xff0c;这是构建算法的一种基本而重要的操作。其中的数据对象&#xff0c;统一地表示和实现为 词条&#xff08;entry&#xff09; 的形式&#xff1b;不同词条之间&#xff0c;依照各自的 关键码…

Python:使用PySimpleGUI中sg.Input控件获取数据plot导致yticks错乱

sg.Input获取y轴数据代码 sg.Text(First Read:, font("Times New Roman", 9)),sg.Input(key-first_read-, size(25, 1), default_text0,0,0, justificationcenter, font("Times New Roman", 9), expand_xTrue), sg.Text(Second Read:, font("Times Ne…

Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

文章目录 1、官网简介2、在vue3中使用1)、需要导入vue3支持的版本插件2)、在mian.js里引入&#xff1a;3)、在组件中使用 3、layout布局的计算逻辑4、 gridLayout 的属性 该栅格系统目前对 vue2 的支持是最好的&#xff0c;vue3 是需要用插件支持的&#xff0c;会在小节详细讲解…

求二维子数组的和(剖析)

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;本篇剖析一下二维子数组求和规则&#xff1a; &#x1f412;个人主页 &#x1f3c5;JavaSE系列专栏 &#x1f4d6;前言&#xff1a;本篇剖析一下二维子数组求和 规则&#xff1a; 这…

PyTorch C++ 前端:张量

本篇文章将尝试了解 PyTorch 组件的高级概述以及它们如何配合。 PyTorch 组件的高级概述 后端 PyTorch 后端是用 C++ 编写的,它提供 API 来访问高度优化的库,例如:用于高效矩阵运算的张量库、用于执行 GPU 运算的 CUDA 库以及用于梯度计算的自动微分等。 前端 可以使用…

蓝牙核心规范(V5.4)10.2-BLE 入门笔记之CIS篇

LE CIS 同步通信 同步通信提供了一种使用蓝牙LE在设备之间传输有时间限制的数据的方式。它提供了一个机制,允许多个接收器设备在不同的时间从相同的源接收数据,以同步它们对该数据的处理。LE AUDIO使用同步通信。 当使用同步通信时,数据具有有限的时间有效期,在到期时被认…

【强化学习】01—— 强化学习简介

文章目录 两种机器学习类型强化学习定义强化学习交互过程强化学习系统要素历史(History)状态(State)策略(Policy)奖励(Reward)价值函数(Value Function)模型(Model)迷宫例子 强化学习智能体分类参考 两种机器学习类型 监督学习/无监督学习/强化学习/机器学习之间的关系 预测 根…

坚鹏:浙江农商联合银行同业核心产品解读与差异化分析培训第7期

浙江农商联合银行同业核心产品解读与差异化分析培训第7期 1952年&#xff0c;浙江第一家农村信用社成立。2004年4月18日&#xff0c;浙江省农信联社成立&#xff0c;承担对全省农信社的管理、指导、协调和服务职能。2021年10月&#xff0c;经国务院批准同意、银保监会批复&…

虚拟DOM与diff算法

虚拟DOM与diff算法 snabbdom虚拟DOMdiff算法 snabbdom 是什么&#xff1a;snabbdom是著名的虚拟DOM库&#xff0c;是diff算法的鼻祖&#xff0c;Vue源码借鉴了snabbdom 虚拟DOM 是什么&#xff1a;本质上是存在内存里的 JavaScript 对象 作用&#xff1a;用来描述真实DOM的层…

Android毕业设计,基于Android 语音朗读书籍管理系统

视频演示&#xff1a; 基于Android 语音朗读书籍管理系统 基于 Android 的语音朗读书籍管理系统可以提供用户管理书籍、朗读书籍的功能。以下是一个简单的步骤和功能列表&#xff1a; 用户注册和登录功能&#xff1a; 用户可以注册新账号或使用现有账号登录系统。用户信息可以包…