新闻伪造检测平台项目经验
完整功能介绍
- 统计数据:当前检验最多的虚假新闻,当前检验最多的假新闻种类,总检验的新闻等数据
 - 新闻检验:
- 文字:包含概述、句子分析、来源分析
 - 图片:伪造情况报告包含新闻质量、健康度、AI程度、虚假新闻程度、伪造种类相似度
 - 音频:通过SenseVoice转文字获得文字,作为事实判断、情绪识别、人物音色推断
 
 - 个人知识库:使用ragflow内的个人知识库进行连接,主要增删改查以及解析功能
 - 虛假新闻盘点:
- 知识库:通过个人知识库+在线搜索实现虚假新闻的AI识别
 - 智能图表:可以通过图形例如饼图折现图,去展示我们提供的今日虚假新闻
 
 - 虛假新闻预测:包含我们爬到的热点新闻以及对应的预测可能出现的虚假新闻标题,提取一步组织虚假新闻传播
 - 虛假新闻还原:通过流水线的方式,经过用户提供数据、新闻预处理、虛假新闻检测、报告生成这几个阶段形成一个虚假新闻报告,内部还有大模型尝试还原虚假新闻后的内容
 - 虚假新闻智能体:用户定制属于自己的工作流,包含爬虫、知识库、图表、LLM等节点
 - 爬虫:基于自然语言的实时数据爬取的虚假新闻检测
 - 多平台:利用electron实现跨win、mac打包客户端
 
创新点
- 知识库
 - 智能图表
 - 流水线
 - 智能体
 - 爬虫
 - 音频推断
 
虚假新闻智能体创新点的必要性
可以开放API,其次这一个点是可以区分于我们正常流程只有智能体可以更好的做到,假设一个企业不准备自己开发这一个功能,而是需要对接其他平台,如果将正常流程作为API的话,实际上调用有很多缺点,企业只能利用固定的流程,并且传入的变量,输出的内容企业都是不可控的,但是如果是可编排的可视化智能体的话,流程自定义、输入自定义、输出自定义,这样才能完全发挥它的用处
同时可以作为我们缺失的商业化的一部分写进去,并且市面上也确实没有提供这样服务的项目
之前一直觉得智能体没用实际上是因为我们平台实际上目前就是一个完整的智能体,而智能体最关键的定制功能对于普通用户来说是无关痛痒的,用户的需求就是简单用上最好的智能体,而最关键的定制功能对于c端来说才是关键,能够契合进入不同需求的不同应用
py中的.env使用
.env文件
.env 文件用于存储环境变量,通常包含敏感信息,如 API 密钥、数据库连接信息等。
示例:
1  | # .env 文件  | 
- 安装 
python-dotenv 
Python 需要 dotenv 库来读取 .env 文件:
1  | pip install python-dotenv  | 
- 在 Python 中加载 
.env 
在代码中使用 dotenv.load_dotenv() 加载 .env 文件中的环境变量:
1  | from dotenv import load_dotenv  | 
- 与 OpenAI API 交互
 
示例代码:
1  | from openai import OpenAI  | 
- 错误处理
 
.env文件必须放在项目根目录,否则需要在load_dotenv()中指定路径,例如load_dotenv(dotenv_path="path/to/.env")。os.getenv("VAR_NAME")获取不到值时,可能是.env文件未正确加载。
.gitignore使用
1  | # Python 编译文件  | 
.gitignore 规则整理
- Python 编译文件
 
1  | __pycache__/  | 
__pycache__/:Python 运行时自动生成的字节码缓存文件夹。*.pyc、*.pyo:Python 编译的字节码文件,不需要提交到版本控制系统。
- 虚拟环境
 
1  | venv/  | 
venv/和env/:Python 虚拟环境目录,防止提交依赖环境。*.env/和.env:存储环境变量的文件(如 API 密钥),应避免提交以防止泄露。
- FastAPI 相关文件
 
1  | *.sqlite3  | 
*.sqlite3:SQLite 数据库文件,避免提交数据库数据到 Git。db.sqlite3:常见的 SQLite 数据库文件名称,应忽略。
- 临时文件
 
1  | *.log  | 
*.log:日志文件,通常不需要提交。*.pot:Python 翻译模板文件,可能是自动生成的,不建议提交。*.pyc:重复出现在 Python 编译文件部分,可保持或删除重复项。
- IDE 配置文件
 
1  | .vscode/  | 
.vscode/:VS Code 编辑器的配置目录,包含用户自定义设置,不应提交。.idea/:JetBrains IDE(如 PyCharm)的项目配置文件,建议忽略。
- 操作系统生成的文件
 
1  | .DS_Store  | 
.DS_Store:macOS 自动生成的目录元数据文件。Thumbs.db:Windows 资源管理器生成的缩略图缓存文件。
- Fake News Detection 相关文件
 
1  | fake_news.json  | 
fake_news.json和hot_news.json:可能是 Fake News Detection 平台的临时数据文件,防止提交测试数据或敏感信息。
Crawl4Al
项目结构如下:
1  | my_project/  | 
快速上手
1  | import asyncio  | 
基于 Schema 的爬取
- Schema 定义
 
使用 JSON Schema 来定义需要提取的数据结构:
baseSelector: 指定数据所在的父级 HTML 元素```
fields1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
: 定义具体要提取的字段,包括:
- `name`: 字段名称
- `selector`: CSS 选择器
- `type`: 提取方式,如 `text` 或 `attribute`
- `attribute`: 当 `type` 为 `attribute` 时,指定提取的属性
```python
schema = {
"name": "辟谣信息",
"baseSelector": "ul#list li",
"fields": [
{
"name": "date",
"selector": "p.domPC",
"type": "text"
},
{
"name": "link",
"selector": "h2 a",
"type": "attribute",
"attribute": "href"
}
]
}
- 提取策略
 
使用 JsonCssExtractionStrategy 解析 HTML,并根据 schema 提取数据。
1  | extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)  | 
- 爬取配置
 
创建 CrawlerRunConfig 以配置爬取策略:
extraction_strategy: 应用提取规则cache_mode: 设为CacheMode.BYPASS以跳过缓存,确保获取最新数据
1  | config = CrawlerRunConfig(  | 
- 数据提取
 
使用 AsyncWebCrawler 运行爬虫,并解析提取的数据:
1  | async with AsyncWebCrawler(headless=True, verbose=True) as crawler:  | 
- 数据处理
 
提取成功后:
- 解析 JSON 数据
 - 修正相对路径
 - 保存为 JSON 文件
 
1  | if result.success:  | 
页面交互
- 点击 “查看更多” 按钮
 
模拟用户操作,点击 “查看更多” 按钮,并滚动加载更多内容:
1  | async function clickLoadMore(maxClicks) {  | 
- 滚动到底部
 - 点击 “查看更多”
 - 等待加载
 - 记录点击次数
 - 如果页面高度不变,则停止
 
- 等待内容加载
 
爬虫在执行爬取前,需要等待 JavaScript 动态加载完成:
1  | js:() => {  | 
- 读取 
click_count - 当点击次数达到 1 次后,返回 
true - 确保页面已经动态加载了新的内容
 
- 集成到爬取流程
 
爬取时,将 JS 代码作为 js_code 传入:
1  | result = await crawler.arun(  | 
- 先执行 
js_click_more进行点击和滚动 wait_for确保数据加载完成- 之后再提取数据
 
浏览器设置
大模型爬取笔记
- 使用大模型进行内容提取
 
爬取过程中,利用大模型(如 DeepSeek)解析网页,并按指定的结构提取信息。
1.1 定义数据结构
使用 pydantic.BaseModel 定义新闻数据的结构:
1  | class FakeNews(BaseModel):  | 
1.2 配置 LLM 提取策略
1  | llm_strategy = LLMExtractionStrategy(  | 
instruction: 提示大模型需要提取的内容apply_chunking: 采用分块处理,防止长文本截断chunk_token_threshold: 每个分块的最大 Token 数overlap_rate: 分块间的重叠率,确保上下文连贯
1.3 爬取配置
1  | crawl_config = CrawlerRunConfig(  | 
确保数据每次都重新爬取,避免缓存影响。
1.4 处理提取的数据
1  | async def fetch_and_process_link(result, date):  | 
- 解析 LLM 提取的 JSON 数据
 - 移除可能的 
error字段 - 补充 
date字段 
并行爬取笔记
- 优化并行任务
 
使用 SemaphoreDispatcher 控制并行任务,并设定速率限制器 (RateLimiter)。
1.1 配置爬取速率
1  | rate_limiter = RateLimiter(  | 
base_delay: 设定 0.1~0.2 秒的最小请求间隔,加速并发max_retries: 允许最多 5 次重试rate_limit_codes: 当遇到429(请求过多)或503(服务不可用)时,自动等待并重试
1.2 监控爬取进度
1  | monitor = CrawlerMonitor(  | 
- 监控爬取进度,提供可视化日志
 
1.3 配置并发控制
1  | dispatcher = SemaphoreDispatcher(  | 
max_session_permit: 限制最大并发任务数为30rate_limiter: 结合速率控制,避免触发反爬机制
1.4 批量爬取
1  | async with AsyncWebCrawler(config=browser_cfg) as crawler:  | 
- 使用 
arun_many并发爬取所有链接 - 结合 
dispatcher进行并发控制 
1.5 数据存储
1  | with open("./data/fake_news.json", "w", encoding="utf-8") as file:  | 
- 解析数据并存储为 JSON 文件
 
超长 HTML 处理方案
🔹 问题
- HTML 过长时,大模型(LLM)难以一次性处理完整页面,导致报错超出上下文。
 - 需要 分块(chunking) 处理,以保证大模型能完整解析所有内容。
 
🔹 解决方案
1. 启用 Chunking 机制
1  | chunk_token_threshold=1500, # 降低分块 token 阈值  | 
chunk_token_threshold=1500:将单个分块的 Token 数限制在 1500 以内,减少单次输入长度,防止超限。overlap_rate=0.3:提高 30% 的内容重叠,确保跨块内容的连贯性,避免信息缺失。
2. 使用 CSS 选择器提取关键内容
1  | css_selector="#Con11"  | 
- 只抓取新闻排行榜相关内容,减少无关数据,提高提取准确性。
 
浏览器设置以及部分调试心得
主要需要注意的点是下面的这个无头模式,改为False可以启动浏览器,方便调试
1  | browser_cfg = BrowserConfig(  | 
还有一点就是浏览器设置是,不存在控制浏览器在调试完成后,不自动关闭的属性的
可以在wait_for属性中使用下面的等待策略进行调试,将return true;去掉,这样就可以保证浏览器一直处于等待状态而不关闭
1  | # 定义爬虫配置  | 
FastAPI
启动命令:uvicorn app.main:app –reload(注意main.py需要位于app文件夹的外侧,才能正确启动,不过我感觉内侧比较合适,只不过内侧的话需要增加一个命令用于进入app文件夹下面)
项目结构如下:
1  | my_project/  | 
main.py
需要注意的是别忘了在main.py将路由注册,以及需要加上app这个主包,保证找得到文件
1  | from fastapi import FastAPI  | 
流式传输
- 示例代码
 
代码片段实现了一个 FastAPI 路由,使用 OpenAI API 生成流式响应:
1  | from fastapi import APIRouter, HTTPException  | 
- 代码核心解析
 
2.1 路由与请求参数
@router.post("/ask_fake_news")定义了一个 POST 请求接口ask_fake_news,用于接收用户的提问。userContent通过Pydantic进行数据校验,要求请求体包含user_content字段。
2.2 处理用户请求
user_content = user_input.user_content获取用户输入的内容。fake_news_data = load_fake_news_schema()加载虚假新闻数据,作为 AI 生成答案的参考依据。
2.3 生成 OpenAI 流式响应
```
generate_openai_response(system_content, user_content, stream=True)1
2
3
4
5
6
7
8
9
10
11
:
- `system_content`:传递给 AI 的背景信息,提供 JSON 格式的虚假新闻数据。
- `user_content`:用户输入的具体问题。
- `stream=True`:启用流式传输,返回一个异步生成器对象。
**2.4 定义流式生成器**
- ```
response_generator()是一个异步生成器:
for chunk in response:遍历 AI 生成的流式内容。chunk_message = chunk.choices[0].delta.content提取每个返回片段。yield chunk_message逐步返回数据。
2.5 返回流式响应
StreamingResponse(response_generator(), media_type="text/plain")通过StreamingResponse将response_generator()的数据流式发送给客户端,减少延迟并提升用户体验。
请求openai类库封装
1  | from openai import OpenAI  | 
快速导出requirements.txt
一般使用pipreqs的方法
仅导出 requirements.txt 里需要的依赖:
有时 pip freeze 会导出很多不必要的包,可以手动删除无关的行,或者用 pipreqs 生成:
1  | pip install pipreqs  | 
这将基于代码中的 import 自动生成 requirements.txt,更精简。
你可以使用以下命令快速导出 requirements.txt:
1  | pip freeze > requirements.txt  | 
详细解释:
 • pip freeze 会列出当前 Python 环境中已安装的所有依赖及其版本。
 • > 符号用于将输出写入 requirements.txt 文件。
docker部署
参考:https://fastapi.tiangolo.com/zh/deployment/docker/
首先使用上面的快速导出requirements.txt的方法导出requirements.txt
需要注意的是uvicorn是没有通过上面的方法导出的,后面报错后才发现的
1  | fastapi==0.115.7  | 
Dockerfile
需要注意的是app.main:app,这个是因为main位于app包下面,之前还遇见过一个错误是使用了官方基于FastAPI的py镜像,导致端口错误,但是实际上官方不建议使用这个镜像
还有就是"--host", "0.0.0.0"非常有必要,如果默认使用127.0.0.1的话,就只会接受本地的IP
1  | # 使用官方 FastAPI 镜像(基于 Python)  | 
运行命令
参考:https://www.assen.top/blog/2024-10-12-docker-proxy中的场景二
需要注意的是--network host这个参数,不加的话很大概率报错ERROR [linux/amd64 internal] load metadata for docker.io/tiangolo/uvicorn-gunicorn-fastapi:python3.9   ,主要原因是创建镜像需要网络连接,这个时候需要指定经过的宿主机网络
1  | docker buildx build --network host --platform linux/amd64,linux/arm64 -t tecnb/news-guard-api:remote --push .  | 
docker-compose.yml
1  | version: '3.8'  | 
类openai界面封装
解决unknown at rule apply 问题
参考:https://blog.csdn.net/njkl2166/article/details/135010067
原因是使用了apply去使用taliwindcss中所定的class名称,导致无法找到,需要添加两个设置文件
新建文件.vscode/tailwindcss.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55{
"version": 1.1,
"atDirectives": [
{
"name": "@tailwind",
"description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#tailwind"
}
]
},
{
"name": "@apply",
"description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#apply"
}
]
},
{
"name": "@responsive",
"description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#responsive"
}
]
},
{
"name": "@screen",
"description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#screen"
}
]
},
{
"name": "@variants",
"description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#variants"
}
]
}
]
}新建文件.vscode/settings.json
1
2
3
4// .vscode/settings.json
{
"css.customData": [".vscode/tailwindcss.json"]
}
express服务器上线
这个是顺道帮忙时解决的
先是直接在终端npm run start,然后通过nginx转发端口
1  | server {  | 
但是由于终端会自动关闭,后续使用了pm2这样一个node管理器,保证不会关闭以及实现快速重启
SSL证书部署问题
下面这几行在配置中很关键,如果之前去掉的话会报错站点配置文件中未找到标识信息【#error_page 404/404.html;】,无法确定SSL配置添加位置,请尝试手动添加标识或恢复配置文件
1  | #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则  | 
完整如下:
1  | server {  | 
使用WaveSurfer实现音频波形图
步骤 1: 安装 wavesurfer.js
1  | npm install wavesurfer.js  | 
步骤 2: 创建音频波形图组件
202202050225
Zjc093613
1  | <template>  | 
步骤 3: 使用波形图组件
1  | <template>  | 
RagFlow
Mac 部署
难点:
官方不维护arm64版本的镜像,需要自己去构筑
构筑完成后如何让该镜像被正确的使用也是问题,官方底下以及所有能够搜到的大部分教程都是去使用
docker-compose-macos.yml去启动,实际上官方这个macos的yml文件有问题,最后构筑出来的是amd64平台,应该使用docker-compose.yml进行启动需要的资源量多,需要去docker软件中将Disk容量拉到120GB以上
步骤:
首先克隆项目,然后进入到对应文件夹
1  | git clone https://github.com/infiniflow/ragflow.git  | 
修改env,MEM_LIMIT拉高,防止内存不足,建议拉到12GB以上
1  | MEM_LIMIT=13073741824  | 
下载需要的依赖
1  | pip3 install huggingface_hub nltk  | 
通过下面的命令进行构筑米,注意构筑时间非常长
1  | docker build --network=host -f Dockerfile.deps -t infiniflow/ragflow_deps .  | 
修改docker-compose.yml,image部分改为自己本地构筑好的镜像
1  | include:  | 
使用下面命令进行容器启动
1  | docker compose -f docker/docker-compose.yml up  | 
报错:
Bug1
1  | failed to solve: infiniflow/ragflow_deps:latest: failed to resolve source metadata for docker.io/infiniflow/ragflow_deps:latest: no match for platform in manifest: not found  | 
该报错在于使用docker-compose-macos.yml去进行启动,可以加上platform: linux/x86_64,避免报错但是最后启动时,rag-server启动会出错
Bug2
1  | ImportError: /usr/lib/x86_64-linux-gnu/libodbc.so.2: file too short  | 
该报错在于docker-compose-macos.yml正确启动后的报错,原因是官方的这个yml并没有正确构筑,在其dockerfile中对于arm64平台没做判断,最后平台不同导致无法启动
Bug3
1  | {"code":100,"data":null,"message":"<NotFound '404: Not Found'>"}  | 
该报错在于使用http://127.0.0.1:9380/去进行访问,实际上应该使用http://127.0.0.1进行访问
API使用
列举关键API,RagFlow的API有多个不同的ID,在实际返回中却没有对应的区别,导致需要猜测这个ID对应的属性
Header:
'Authorization: Bearer <YOUR_API_KEY>'
列出数据集
id为dataset_id
1
Get http://127.0.0.1/api/v1/datasets?id=be7f86d0f31711efb8b10242ac120006
返回:
此处的id为dataset_id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36{
"code": 0,
"data": [
{
"avatar": null,
"chunk_count": 14,
"chunk_method": "naive",
"create_date": "Tue, 25 Feb 2025 09:27:57 GMT",
"create_time": 1740446877761,
"created_by": "93128efef31511efac840242ac120006",
"description": null,
"document_count": 1,
"embedding_model": "",
"id": "be7f86d0f31711efb8b10242ac120006",
"language": "English",
"name": "fake-news",
"pagerank": 0,
"parser_config": {
"pages": [
[
1,
1000000
]
]
},
"permission": "me",
"similarity_threshold": 0.2,
"status": "1",
"tenant_id": "93128efef31511efac840242ac120006",
"token_num": 2585,
"update_date": "Tue, 25 Feb 2025 09:29:37 GMT",
"update_time": 1740446977285,
"vector_similarity_weight": 0.3
}
]
}列出聊天助手
id为chat_id
1
Get http://127.0.0.1/api/v1/chats?id=22c63b20f31811ef85c10242ac120006
返回:
此处的id为session_id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71{
"code": 0,
"data": [
{
"chat_id": "22c63b20f31811ef85c10242ac120006",
"create_date": "Tue, 25 Feb 2025 09:31:13 GMT",
"create_time": 1740447073578,
"id": "1f9c8eac44c34b2c98dcfda139aea23f",
"messages": [
{
"content": "你好! 我是你的助理,有什么可以帮到你的吗?",
"role": "assistant"
},
{
"content": "即食米饭能保存很久,加了大量防腐剂嘛",
"doc_ids": [],
"id": "d11a2bf6-8d6a-4c99-8ec0-53a6e77d8d4f",
"role": "user"
},
{
"content": "根据知识库中的信息,即食米饭能保存很久并不是因为加了大量防腐剂 ##0$$。其保质期长的关键在于制作过程中严格灭菌和密封包装 ##1$$。具体来说:\n\n1. **严格灭菌**:即食米饭在生产过程中会对原料进行杀菌,并在一次包装后进行最终灭菌,使得其内外几乎无菌,能够在常温下长时间保存。\n2. **密封包装**:真空密封包装避免了外界空气和细菌的进入,从根本上阻止了微生物的生长。\n\n这种工艺与罐头食品类似,无需添加防腐剂即可实现长期保存。因此,即食米饭的制作过程完全符合食品安全标准,消费者可以根据需求安心选购。\n\n**来源**: “科学辟谣”微信公众号",
"created_at": 1740447087.4371278,
"id": "d11a2bf6-8d6a-4c99-8ec0-53a6e77d8d4f",
"reference": [
{
"content": "{\"1\": {\"measures\": \"对编造散布地震谣言扰乱公共秩序、造成恶劣社会影响的行为,公安机关将依法依规严肃查处。请广大网民擦亮眼睛,勿轻信传播非正规来源、未经证实的地震信息。\", \"date\": \"2025-01-24\"}}{\"2\": {\"headline\": \"即食米饭能保存很久,一定是加了大量防腐剂?\", \"field\": \"食品安全\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "a4e230032be5e6c4",
"image_id": "",
"positions": []
},
{
"content": "{\"2\": {\"truth\": \"即食米饭保质期长,关键在于制作过程中严格灭菌和密封包装,与防腐剂无关。即食米饭在生产中,不仅会对原料进行杀菌,还会在一次包装后进行最终灭菌,这使得其内外都几乎无菌,能够在常温下长时间保存。此外,真空密封包装避免了外界空气和细菌的进入,从根本上阻止了微生物的生长。这种工艺与罐头食品类似,无需添加防腐剂即可实现长期保存。总之,即食米饭的制作过程完全符合食品安全标准,消费者可以根据需求安心选购。\", \"source\": \"“科学辟谣”微信公众号\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "e0d57fe3b5f1f16f",
"image_id": "",
"positions": []
},
{
"content": "{\"2\": {\"measures\": \"建议消费者将其作为应急或便捷选择,平时仍应以新鲜米饭为主,均衡饮食才是健康之道。\", \"date\": \"2025-01-24\"}}{\"3\": {\"headline\": \"过年遇到这样的红包,务必警惕!\", \"field\": \"网络诈骗\", \"truth\": \"过年期间,几个朋友拉微信群发红包,好不热闹。但如果你突然被拉入一个陌生群聊,告知不仅有“福利”还能“赚钱”,你该怎么办?警方提示,这是典型的刷单返利类诈骗。\", \"source\": \"“熊猫反诈”微信公众号\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "c6ef9e51c38548b9",
"image_id": "",
"positions": []
},
{
"content": "{\"7\": {\"source\": \"“南京网络辟谣”微信公众号\", \"measures\": \"\", \"date\": \"2025-01-22\"}}{\"8\": {\"headline\": \"抢票软件真的抢票更快?\", \"field\": \"科技\", \"truth\": \"春运首周,市面上涌现出大量“抢票软件”,号称“只要加钱就能抢到票”。实际上,当12306显示“无票”,有些抢票软件显示“有票”,这样的信息其实都是从12306爬取、修改加工而来的,目的是诱导旅客买长乘短、买短乘长,让旅客多花钱。抢票软件的“加速包”其实也是忽悠旅客的一个噱头,花钱购买加速包,抢票速度也不会提升。需要注意的是,12306平台从来没有和任何第三方平台机构合作,没有将票额分配给任何第三方平台发售,也没有和任何第三方平台进行数据连接。\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "ee5042a9f76c4e6c",
"image_id": "",
"positions": []
}
],
"role": "assistant"
}
],
"name": "即食米饭能保存很久,加了大量防腐剂嘛",
"update_date": "Tue, 25 Feb 2025 09:31:27 GMT",
"update_time": 1740447087437,
"user_id": null
}
]
}列出聊天助手的会话
id为chat_id
1
Get http://127.0.0.1/api/v1/chats/22c63b20f31811ef85c10242ac120006/sessions
返回:
id为session_id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71{
"code": 0,
"data": [
{
"chat_id": "22c63b20f31811ef85c10242ac120006",
"create_date": "Tue, 25 Feb 2025 09:31:13 GMT",
"create_time": 1740447073578,
"id": "1f9c8eac44c34b2c98dcfda139aea23f",
"messages": [
{
"content": "你好! 我是你的助理,有什么可以帮到你的吗?",
"role": "assistant"
},
{
"content": "即食米饭能保存很久,加了大量防腐剂嘛",
"doc_ids": [],
"id": "d11a2bf6-8d6a-4c99-8ec0-53a6e77d8d4f",
"role": "user"
},
{
"content": "根据知识库中的信息,即食米饭能保存很久并不是因为加了大量防腐剂 ##0$$。其保质期长的关键在于制作过程中严格灭菌和密封包装 ##1$$。具体来说:\n\n1. **严格灭菌**:即食米饭在生产过程中会对原料进行杀菌,并在一次包装后进行最终灭菌,使得其内外几乎无菌,能够在常温下长时间保存。\n2. **密封包装**:真空密封包装避免了外界空气和细菌的进入,从根本上阻止了微生物的生长。\n\n这种工艺与罐头食品类似,无需添加防腐剂即可实现长期保存。因此,即食米饭的制作过程完全符合食品安全标准,消费者可以根据需求安心选购。\n\n**来源**: “科学辟谣”微信公众号",
"created_at": 1740447087.4371278,
"id": "d11a2bf6-8d6a-4c99-8ec0-53a6e77d8d4f",
"reference": [
{
"content": "{\"1\": {\"measures\": \"对编造散布地震谣言扰乱公共秩序、造成恶劣社会影响的行为,公安机关将依法依规严肃查处。请广大网民擦亮眼睛,勿轻信传播非正规来源、未经证实的地震信息。\", \"date\": \"2025-01-24\"}}{\"2\": {\"headline\": \"即食米饭能保存很久,一定是加了大量防腐剂?\", \"field\": \"食品安全\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "a4e230032be5e6c4",
"image_id": "",
"positions": []
},
{
"content": "{\"2\": {\"truth\": \"即食米饭保质期长,关键在于制作过程中严格灭菌和密封包装,与防腐剂无关。即食米饭在生产中,不仅会对原料进行杀菌,还会在一次包装后进行最终灭菌,这使得其内外都几乎无菌,能够在常温下长时间保存。此外,真空密封包装避免了外界空气和细菌的进入,从根本上阻止了微生物的生长。这种工艺与罐头食品类似,无需添加防腐剂即可实现长期保存。总之,即食米饭的制作过程完全符合食品安全标准,消费者可以根据需求安心选购。\", \"source\": \"“科学辟谣”微信公众号\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "e0d57fe3b5f1f16f",
"image_id": "",
"positions": []
},
{
"content": "{\"2\": {\"measures\": \"建议消费者将其作为应急或便捷选择,平时仍应以新鲜米饭为主,均衡饮食才是健康之道。\", \"date\": \"2025-01-24\"}}{\"3\": {\"headline\": \"过年遇到这样的红包,务必警惕!\", \"field\": \"网络诈骗\", \"truth\": \"过年期间,几个朋友拉微信群发红包,好不热闹。但如果你突然被拉入一个陌生群聊,告知不仅有“福利”还能“赚钱”,你该怎么办?警方提示,这是典型的刷单返利类诈骗。\", \"source\": \"“熊猫反诈”微信公众号\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "c6ef9e51c38548b9",
"image_id": "",
"positions": []
},
{
"content": "{\"7\": {\"source\": \"“南京网络辟谣”微信公众号\", \"measures\": \"\", \"date\": \"2025-01-22\"}}{\"8\": {\"headline\": \"抢票软件真的抢票更快?\", \"field\": \"科技\", \"truth\": \"春运首周,市面上涌现出大量“抢票软件”,号称“只要加钱就能抢到票”。实际上,当12306显示“无票”,有些抢票软件显示“有票”,这样的信息其实都是从12306爬取、修改加工而来的,目的是诱导旅客买长乘短、买短乘长,让旅客多花钱。抢票软件的“加速包”其实也是忽悠旅客的一个噱头,花钱购买加速包,抢票速度也不会提升。需要注意的是,12306平台从来没有和任何第三方平台机构合作,没有将票额分配给任何第三方平台发售,也没有和任何第三方平台进行数据连接。\"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "ee5042a9f76c4e6c",
"image_id": "",
"positions": []
}
],
"role": "assistant"
}
],
"name": "即食米饭能保存很久,加了大量防腐剂嘛",
"update_date": "Tue, 25 Feb 2025 09:31:27 GMT",
"update_time": 1740447087437,
"user_id": null
}
]
}与聊天助手交谈
id为chat_id
会话的 ID。如果未提供,将生成一个新会话
1
Get http://127.0.0.1/api/v1/chats/22c63b20f31811ef85c10242ac120006/completions
Body
id为session_id
1
2
3
4
5{
"question": "告诉我2025-01-24的虚假新闻",
"stream": false,
"session_id": "1f9c8eac44c34b2c98dcfda139aea23f"
}返回:
id为对话中该句的ID,目前没发现具体作用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95{
"code": 0,
"data": {
"answer": "xxxx",
"audio_binary": null,
"created_at": 1740488049.0561419,
"id": "cbcc0e18-34cd-4b25-b862-3b314100e24b",
"prompt": "xxxx",
"reference": {
"chunks": [
{
"content": "xxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "a4e230032be5e6c4",
"image_id": "",
"positions": []
},
{
"content": "xxxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "c6ef9e51c38548b9",
"image_id": "",
"positions": []
},
{
"content": "xxxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "d708e17ccbfc894b",
"image_id": "",
"positions": []
},
{
"content": "xxxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "f499654c7ee42b70",
"image_id": "",
"positions": []
},
{
"content": "xxxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "ca747667448e60b2",
"image_id": "",
"positions": []
},
{
"content": "xxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "8d54480f9aa2c954",
"image_id": "",
"positions": []
},
{
"content": "xxxx",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "4066c2fd517a8920",
"image_id": "",
"positions": []
},
{
"content": "xxxx"}}",
"dataset_id": "be7f86d0f31711efb8b10242ac120006",
"document_id": "db911ec8f31711ef949e0242ac120006",
"document_name": "fake_news.json",
"id": "66c840574441e3a3",
"image_id": "",
"positions": []
}
],
"doc_aggs": [
{
"count": 8,
"doc_id": "db911ec8f31711ef949e0242ac120006",
"doc_name": "fake_news.json"
}
],
"total": 12
},
"session_id": "1f9c8eac44c34b2c98dcfda139aea23f"
}
}
解决httpx的Delete无法正确传参数的问题
参考:https://github.com/encode/httpx/discussions/1587
该用request进行请求,然后在第一个参数位置给出”DELETE”请求方式
1  | 
  | 
vue3 路由参数影响网络代理
由于/create-knowledge/:id路由是包含参数的,导致/api也被作为参数传递了,出现不返回后端参数而是返回页面的情况,同时code为307 temporary redirect
路由改为createWebHashHistory就行了
网页插件开发
网络请求
需要注意vite.config.ts里面的代理并不会起效,只需要把baseURL改为正确的后端地址就行,不需要进行转发
Vue3 defineModel 双向绑定
参考:https://cn.vuejs.org/guide/components/v-model
遇到返回不规范JSON的解决方式(JSON5)
参考:https://github.com/json5/json5/issues/240
使用JSON5,但是直接引用的话由于commendJs与ESM的区别,会报错无默认导出
1  | import parse = require('../lib/parse')  | 
导入:
1  | import JSON5 from 'json5';  |