909 lines
26 KiB
Markdown
909 lines
26 KiB
Markdown
# iMeeting 产品路线图
|
||
|
||
## 项目概述
|
||
|
||
iMeeting 是一个智能会议管理和知识库系统,旨在通过 AI 技术提升会议效率,自动生成会议纪要,并从多次会议中提炼知识。
|
||
|
||
---
|
||
|
||
## Phase 1: 基础会议管理与知识库系统(已完成)
|
||
|
||
### 核心功能
|
||
|
||
#### 1. 会议管理
|
||
- **会议创建与录音**:支持创建会议并关联音频文件
|
||
- **音频转录**:基于阿里云 DashScope 的语音识别,支持异步转录
|
||
- **AI 总结生成**:使用大语言模型(通义千问)自动生成会议纪要
|
||
- **提示词模版**:支持预定义和自定义提示词模版,适配不同会议场景
|
||
- **标签系统**:支持为会议添加标签,方便分类和检索
|
||
|
||
#### 2. 知识库系统
|
||
- **基于会议的知识提炼**:从多个会议纪要中提炼知识库内容
|
||
- **自定义提示词**:用户可以指定特定的分析角度和总结需求
|
||
- **Markdown 输出**:知识库内容以 Markdown 格式存储和展示
|
||
- **标签关联**:支持知识库的标签分类
|
||
- **共享机制**:支持知识库的个人/共享模式
|
||
|
||
#### 3. 用户权限管理
|
||
- **用户认证**:基于 JWT 的用户登录与会话管理
|
||
- **角色权限**:区分普通用户和管理员
|
||
- **菜单权限**:动态菜单权限控制系统
|
||
|
||
#### 4. 管理后台
|
||
- **用户管理**:用户创建、编辑、删除、权限配置
|
||
- **系统监控**:在线用户、任务监控、系统资源监控
|
||
- **提示词仓库**:集中管理所有提示词模版
|
||
|
||
### 技术架构
|
||
|
||
#### 后端技术栈
|
||
- **框架**:FastAPI(Python)
|
||
- **数据库**:MySQL 8.0
|
||
- **缓存**:Redis 5.0+
|
||
- **AI 服务**:阿里云 DashScope(通义千问)
|
||
- **对象存储**:七牛云 OSS
|
||
- **异步任务**:FastAPI BackgroundTasks
|
||
|
||
#### 前端技术栈
|
||
- **框架**:React 18
|
||
- **路由**:React Router
|
||
- **UI 组件**:Ant Design + 自定义组件
|
||
- **Markdown 渲染**:react-markdown
|
||
|
||
#### 数据模型(核心表)
|
||
- `users`:用户表
|
||
- `meetings`:会议表
|
||
- `knowledge_bases`:知识库表
|
||
- `prompts`:提示词模版表
|
||
- `transcription_tasks`:转录任务表
|
||
- `summary_tasks`:总结任务表
|
||
- `knowledge_base_tasks`:知识库生成任务表
|
||
- `tags`:标签表
|
||
|
||
---
|
||
|
||
## Phase 2: 知识库系统大升级(规划中)
|
||
|
||
### 升级目标
|
||
|
||
将知识库系统从单一的"会议纪要汇总"升级为功能完整的"AI 知识助手",参考 NotebookLM 的交互模式,提供多维度的知识管理和音频播客生成能力。
|
||
|
||
---
|
||
|
||
### 1. 输入来源扩展
|
||
|
||
#### 1.1 功能需求
|
||
- ✅ **会议来源**(已支持):从多个会议纪要中提炼
|
||
- 🆕 **外部文件上传**:
|
||
- 支持 PDF、Word、TXT、Markdown 文件
|
||
- 支持音频文件(MP3、WAV、M4A)
|
||
- 支持视频文件(MP4、AVI、MOV)提取音频
|
||
- 单个知识库可混合多种来源
|
||
|
||
#### 1.2 技术方案
|
||
|
||
##### 文档解析
|
||
```python
|
||
# 依赖库选型
|
||
- PDF: PyPDF2 / pdfplumber(文本提取)
|
||
- Word: python-docx(DOCX 文件)
|
||
- Markdown: 直接读取
|
||
- TXT: 直接读取,支持多种编码(UTF-8、GBK)
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:高,Python 生态成熟
|
||
- ⚠️ **挑战**:
|
||
- PDF 中的表格、图片识别(可选用 OCR)
|
||
- 大文件处理(需要分块上传和处理)
|
||
- 💰 **成本**:无额外费用,依赖开源库
|
||
|
||
##### 音频/视频处理
|
||
```python
|
||
# 依赖库选型
|
||
- 音频提取: ffmpeg-python(视频转音频)
|
||
- 音频格式转换: pydub
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:高,现有转录流程可复用
|
||
- ⚠️ **挑战**:
|
||
- 视频文件较大,需要优化存储和处理
|
||
- 需要增加进度反馈
|
||
- 💰 **成本**:
|
||
- 视频存储成本增加(七牛云存储费用)
|
||
- 转录费用与现有一致(按时长计费)
|
||
|
||
##### 数据库设计
|
||
```sql
|
||
-- 新增表:知识库来源文件表
|
||
CREATE TABLE kb_source_files (
|
||
file_id INT AUTO_INCREMENT PRIMARY KEY,
|
||
kb_id INT NOT NULL COMMENT '关联的知识库ID',
|
||
file_type ENUM('pdf', 'docx', 'txt', 'markdown', 'audio', 'video') NOT NULL,
|
||
file_name VARCHAR(255) NOT NULL,
|
||
file_url VARCHAR(512) NOT NULL COMMENT '文件存储URL',
|
||
file_size BIGINT COMMENT '文件大小(字节)',
|
||
extracted_text TEXT COMMENT '提取的文本内容',
|
||
upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (kb_id) REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- 修改知识库表
|
||
ALTER TABLE knowledge_bases
|
||
ADD COLUMN source_type ENUM('meetings', 'files', 'mixed') DEFAULT 'meetings' COMMENT '内容来源类型';
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 提示词模版升级
|
||
|
||
#### 2.1 功能需求
|
||
- ✅ **选择模版**(已支持):从提示词仓库选择预设模版
|
||
- 🆕 **附加提示词**:在模版基础上追加自定义需求
|
||
- 🆕 **结构化输出**:生成标题 + 多级内容(章节、小节)
|
||
- 🆕 **输出格式控制**:支持指定输出结构(JSON Schema)
|
||
|
||
#### 2.2 技术方案
|
||
|
||
##### 提示词组合
|
||
```python
|
||
def build_knowledge_prompt(
|
||
template_prompt: str, # 基础模版
|
||
additional_prompt: str, # 附加提示词
|
||
output_format: dict # 输出格式控制
|
||
) -> str:
|
||
"""
|
||
组合提示词策略:
|
||
1. 基础模版(定义分析维度和风格)
|
||
2. 附加提示词(用户自定义需求)
|
||
3. 输出格式要求(结构化 JSON 或 Markdown)
|
||
"""
|
||
return f"""
|
||
{template_prompt}
|
||
|
||
## 用户补充要求
|
||
{additional_prompt}
|
||
|
||
## 输出格式要求
|
||
请按照以下结构输出(Markdown 格式):
|
||
# 标题
|
||
## 章节1
|
||
### 小节1.1
|
||
内容...
|
||
### 小节1.2
|
||
内容...
|
||
## 章节2
|
||
...
|
||
"""
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:高,现有提示词系统可直接扩展
|
||
- 📊 **优化方向**:
|
||
- 使用通义千问的 `response_format` 参数实现结构化输出
|
||
- 提供可视化的输出结构编辑器
|
||
- 💰 **成本**:无额外成本
|
||
|
||
##### 结构化输出(通义千问支持)
|
||
```python
|
||
# 通义千问支持 JSON Schema 格式控制
|
||
response_format = {
|
||
"type": "json_schema",
|
||
"json_schema": {
|
||
"name": "knowledge_base_output",
|
||
"schema": {
|
||
"type": "object",
|
||
"properties": {
|
||
"title": {"type": "string"},
|
||
"sections": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"section_title": {"type": "string"},
|
||
"subsections": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"subsection_title": {"type": "string"},
|
||
"content": {"type": "string"}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 音频概览生成(TTS 播客)
|
||
|
||
#### 3.1 功能需求
|
||
- 🆕 **文字转语音**:将知识库内容转换为音频
|
||
- 🆕 **播客式对话**(类似 NotebookLM):
|
||
- 双人对话形式(主持人 + 嘉宾)
|
||
- 自然的问答式讲解
|
||
- 语气生动,易于理解
|
||
|
||
#### 3.2 技术方案
|
||
|
||
##### 方案一:基础 TTS(快速实现)
|
||
|
||
**服务选型**:
|
||
```python
|
||
# 1. 阿里云语音合成(推荐)
|
||
- 优势:已集成 DashScope,音质自然,支持多音色
|
||
- 成本:约 0.002 元/次(100字符)
|
||
- 特性:支持 SSML 标签控制语速、停顿
|
||
|
||
# 2. 微软 Azure TTS
|
||
- 优势:音质最佳,支持神经网络语音
|
||
- 成本:约 $4/百万字符
|
||
- 特性:支持情感控制、多语言
|
||
|
||
# 3. OpenAI TTS
|
||
- 优势:音质优秀,与 GPT 集成度高
|
||
- 成本:约 $15/百万字符
|
||
- 特性:6 种不同音色可选
|
||
```
|
||
|
||
**实现流程**:
|
||
```python
|
||
async def generate_basic_audio(kb_content: str) -> str:
|
||
"""
|
||
基础 TTS 实现
|
||
1. 文本预处理(分段、去除特殊字符)
|
||
2. 调用 TTS API
|
||
3. 音频文件合并
|
||
4. 上传到七牛云
|
||
"""
|
||
# 分段处理(避免单次请求过长)
|
||
segments = split_text_by_paragraphs(kb_content, max_length=500)
|
||
|
||
audio_files = []
|
||
for segment in segments:
|
||
audio = await tts_service.synthesize(
|
||
text=segment,
|
||
voice="zhichu", # 阿里云音色
|
||
rate=1.0, # 语速
|
||
pitch=0 # 音调
|
||
)
|
||
audio_files.append(audio)
|
||
|
||
# 合并音频
|
||
final_audio = merge_audio_files(audio_files)
|
||
audio_url = upload_to_qiniu(final_audio, "kb_audio")
|
||
|
||
return audio_url
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:高,实现简单
|
||
- ⚠️ **局限性**:
|
||
- 单调朗读,无对话感
|
||
- 缺乏停顿和情感
|
||
- 💰 **成本**:
|
||
- 阿里云 TTS:约 0.02 元/千字
|
||
- 10 万字知识库:约 2 元/次
|
||
|
||
---
|
||
|
||
##### 方案二:播客式对话(NotebookLM 风格)
|
||
|
||
**技术架构**:
|
||
|
||
```
|
||
输入: 知识库内容 (Markdown)
|
||
↓
|
||
1. 内容理解与脚本生成
|
||
- 使用 LLM 将内容改写为对话脚本
|
||
- 双人角色:主持人(引导)+ 专家(讲解)
|
||
↓
|
||
2. 对话脚本优化
|
||
- 添加开场白和结束语
|
||
- 插入自然的停顿和过渡
|
||
- 添加情感标记(SSML)
|
||
↓
|
||
3. 多音色 TTS 合成
|
||
- 主持人音色:女声,温和亲切
|
||
- 专家音色:男声,稳重专业
|
||
↓
|
||
4. 音频后处理
|
||
- 添加背景音乐(轻音乐)
|
||
- 音量均衡化
|
||
- 添加片头片尾
|
||
↓
|
||
输出: 播客式音频文件 (MP3)
|
||
```
|
||
|
||
**LLM 脚本生成示例**:
|
||
```python
|
||
PODCAST_SCRIPT_PROMPT = """
|
||
你是一个播客制作专家。请将以下知识库内容改写为一段双人对话脚本:
|
||
- 主持人(Host):提出问题,引导话题,语气轻松友好
|
||
- 专家(Expert):讲解内容,回答问题,语气专业自信
|
||
|
||
要求:
|
||
1. 开场白介绍今天的主题
|
||
2. 通过问答形式逐步展开知识点
|
||
3. 加入自然的过渡语("那么..."、"接下来...")
|
||
4. 结束时做简短总结
|
||
|
||
知识库内容:
|
||
{kb_content}
|
||
|
||
请输出 JSON 格式:
|
||
{{
|
||
"title": "播客标题",
|
||
"intro": {{
|
||
"host": "开场白...",
|
||
"expert": "回应..."
|
||
}},
|
||
"dialogues": [
|
||
{{"speaker": "host", "text": "问题1..."}},
|
||
{{"speaker": "expert", "text": "解答1..."}},
|
||
...
|
||
],
|
||
"outro": {{
|
||
"host": "总结...",
|
||
"expert": "结束语..."
|
||
}}
|
||
}}
|
||
"""
|
||
|
||
async def generate_podcast_script(kb_content: str) -> dict:
|
||
"""使用 LLM 生成播客脚本"""
|
||
response = await llm_service.call(
|
||
prompt=PODCAST_SCRIPT_PROMPT.format(kb_content=kb_content),
|
||
response_format={"type": "json_object"}
|
||
)
|
||
return json.loads(response)
|
||
|
||
async def synthesize_podcast(script: dict) -> str:
|
||
"""合成播客音频"""
|
||
audio_segments = []
|
||
|
||
# 片头音乐
|
||
audio_segments.append(load_intro_music())
|
||
|
||
# 开场白
|
||
for speaker, text in script["intro"].items():
|
||
voice = VOICES[speaker] # {"host": "xiaoyun", "expert": "zhichu"}
|
||
audio = await tts_service.synthesize(text, voice=voice)
|
||
audio_segments.append(audio)
|
||
audio_segments.append(silence(duration=0.5)) # 停顿 0.5 秒
|
||
|
||
# 主体对话
|
||
for dialogue in script["dialogues"]:
|
||
speaker = dialogue["speaker"]
|
||
text = dialogue["text"]
|
||
voice = VOICES[speaker]
|
||
audio = await tts_service.synthesize(text, voice=voice)
|
||
audio_segments.append(audio)
|
||
audio_segments.append(silence(duration=0.3))
|
||
|
||
# 结束语
|
||
for speaker, text in script["outro"].items():
|
||
voice = VOICES[speaker]
|
||
audio = await tts_service.synthesize(text, voice=voice)
|
||
audio_segments.append(audio)
|
||
|
||
# 片尾音乐
|
||
audio_segments.append(load_outro_music())
|
||
|
||
# 合并所有音频
|
||
final_audio = merge_with_background_music(audio_segments)
|
||
|
||
# 上传到七牛云
|
||
audio_url = upload_to_qiniu(final_audio, "kb_podcast")
|
||
return audio_url
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:中等
|
||
- LLM 脚本生成:成熟方案
|
||
- 多音色 TTS:阿里云、Azure 均支持
|
||
- 音频后处理:需要 ffmpeg 或 pydub
|
||
- ⚠️ **挑战**:
|
||
- 脚本质量依赖 LLM prompt 优化
|
||
- 音频合成时长较长(需要异步处理)
|
||
- 音频文件较大,存储成本增加
|
||
- 💰 **成本**(以 5000 字知识库为例):
|
||
- LLM 脚本生成(输入 5000 字 + 输出 3000 字):约 0.05 元
|
||
- TTS 合成(约 3000 字对话):约 0.06 元
|
||
- **总成本:约 0.11 元/次**
|
||
|
||
**音频处理库**:
|
||
```python
|
||
# 新增依赖
|
||
ffmpeg-python==0.2.0 # 音频处理
|
||
pydub==0.25.1 # 音频编辑
|
||
```
|
||
|
||
---
|
||
|
||
##### 方案对比
|
||
|
||
| 特性 | 方案一:基础 TTS | 方案二:播客对话 |
|
||
|------|------------------|------------------|
|
||
| **实现难度** | 低(1-2 天) | 中(3-5 天) |
|
||
| **音频质量** | 单调朗读 | 自然对话 |
|
||
| **用户体验** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
||
| **成本** | 0.02 元/千字 | 0.11 元/5000 字 |
|
||
| **适用场景** | 快速阅读 | 深度学习 |
|
||
|
||
**推荐方案**:
|
||
- 🚀 **Phase 2.1**:先实现方案一(基础 TTS),快速上线
|
||
- 🎯 **Phase 2.2**:再实现方案二(播客对话),提升体验
|
||
|
||
---
|
||
|
||
### 4. NotebookLM 式交互
|
||
|
||
#### 4.1 功能需求
|
||
- 🆕 **知识库问答**:基于知识库内容的智能问答
|
||
- 🆕 **引用溯源**:回答时显示来源(段落、页码)
|
||
- 🆕 **相关内容推荐**:基于用户提问推荐相关知识点
|
||
- 🆕 **多轮对话**:支持上下文记忆的连续对话
|
||
|
||
#### 4.2 技术方案
|
||
|
||
##### 方案一:基于向量数据库的 RAG(推荐)
|
||
|
||
**技术架构**:
|
||
```
|
||
知识库内容
|
||
↓
|
||
1. 文本分块 (Chunking)
|
||
- 按段落或语义分块(500-1000 字/块)
|
||
- 保留元数据(来源、章节、页码)
|
||
↓
|
||
2. 向量化 (Embedding)
|
||
- 使用阿里云通义千问 Embedding API
|
||
- 或使用 OpenAI text-embedding-3-small
|
||
↓
|
||
3. 存储到向量数据库
|
||
- Milvus(开源,功能强大)
|
||
- 或 Qdrant(轻量,易部署)
|
||
- 或 PostgreSQL + pgvector(复用现有数据库)
|
||
↓
|
||
4. 用户提问
|
||
↓
|
||
5. 向量检索
|
||
- 将问题向量化
|
||
- 检索 Top-K 相似内容块
|
||
↓
|
||
6. LLM 生成回答
|
||
- 将检索结果作为上下文
|
||
- 生成准确回答 + 来源引用
|
||
```
|
||
|
||
**实现示例**:
|
||
```python
|
||
from dashscope import TextEmbedding
|
||
from qdrant_client import QdrantClient
|
||
from qdrant_client.models import Distance, VectorParams, PointStruct
|
||
|
||
# 1. 向量化服务
|
||
class EmbeddingService:
|
||
def embed_text(self, text: str) -> List[float]:
|
||
"""将文本转换为向量"""
|
||
response = TextEmbedding.call(
|
||
model='text-embedding-v3',
|
||
input=text
|
||
)
|
||
return response.output['embeddings'][0]['embedding']
|
||
|
||
# 2. 向量数据库
|
||
class VectorStore:
|
||
def __init__(self):
|
||
self.client = QdrantClient(host="localhost", port=6333)
|
||
|
||
def create_collection(self, kb_id: int):
|
||
"""为知识库创建向量集合"""
|
||
self.client.create_collection(
|
||
collection_name=f"kb_{kb_id}",
|
||
vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
|
||
)
|
||
|
||
def add_chunks(self, kb_id: int, chunks: List[dict]):
|
||
"""添加文本块到向量库"""
|
||
points = []
|
||
for i, chunk in enumerate(chunks):
|
||
embedding = embedding_service.embed_text(chunk['text'])
|
||
points.append(PointStruct(
|
||
id=i,
|
||
vector=embedding,
|
||
payload={
|
||
"text": chunk['text'],
|
||
"source": chunk['source'],
|
||
"section": chunk['section']
|
||
}
|
||
))
|
||
self.client.upsert(collection_name=f"kb_{kb_id}", points=points)
|
||
|
||
def search(self, kb_id: int, query: str, top_k: int = 3):
|
||
"""搜索相似内容"""
|
||
query_vector = embedding_service.embed_text(query)
|
||
results = self.client.search(
|
||
collection_name=f"kb_{kb_id}",
|
||
query_vector=query_vector,
|
||
limit=top_k
|
||
)
|
||
return results
|
||
|
||
# 3. RAG 问答
|
||
async def answer_question(kb_id: int, question: str, chat_history: List[dict] = None):
|
||
"""基于知识库回答问题"""
|
||
# 检索相关内容
|
||
results = vector_store.search(kb_id, question, top_k=3)
|
||
|
||
# 构建上下文
|
||
context = "\n\n".join([
|
||
f"[来源: {r.payload['section']}]\n{r.payload['text']}"
|
||
for r in results
|
||
])
|
||
|
||
# 构建 prompt
|
||
prompt = f"""
|
||
基于以下知识库内容回答用户问题。如果无法从内容中找到答案,请明确告知。
|
||
|
||
知识库内容:
|
||
{context}
|
||
|
||
用户问题:{question}
|
||
|
||
请提供准确的回答,并在回答中标注来源章节。
|
||
"""
|
||
|
||
# 调用 LLM
|
||
response = await llm_service.call(prompt, chat_history=chat_history)
|
||
|
||
# 返回回答 + 来源
|
||
return {
|
||
"answer": response,
|
||
"sources": [
|
||
{"section": r.payload['section'], "text": r.payload['text'][:200]}
|
||
for r in results
|
||
]
|
||
}
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:高
|
||
- 向量数据库:Qdrant(轻量级)或 pgvector(复用 MySQL)
|
||
- Embedding:阿里云通义千问 Embedding API(0.0007 元/千 tokens)
|
||
- 📊 **优势**:
|
||
- 回答准确性高(基于实际内容)
|
||
- 支持引用溯源
|
||
- 检索速度快(毫秒级)
|
||
- 💰 **成本**(以 10 万字知识库为例):
|
||
- 向量化:约 0.07 元(一次性)
|
||
- 每次问答检索:免费(本地向量库)
|
||
- LLM 生成:约 0.01 元/次
|
||
|
||
---
|
||
|
||
##### 方案二:基于 LLM 长上下文(备选)
|
||
|
||
**技术方案**:
|
||
```python
|
||
async def answer_with_full_context(kb_content: str, question: str):
|
||
"""直接将整个知识库作为上下文"""
|
||
prompt = f"""
|
||
你是一个知识库助手。请基于以下知识库内容回答用户问题。
|
||
|
||
知识库内容:
|
||
{kb_content}
|
||
|
||
用户问题:{question}
|
||
|
||
请提供准确的回答,并标注引用的段落。
|
||
"""
|
||
response = await llm_service.call(prompt)
|
||
return response
|
||
```
|
||
|
||
**技术评估**:
|
||
- ✅ **可行性**:中等
|
||
- 通义千问支持 128K tokens 上下文
|
||
- 约 10 万字中文
|
||
- ⚠️ **局限性**:
|
||
- 大文本上下文成本高
|
||
- 无法精确定位来源
|
||
- 不支持多知识库联合查询
|
||
- 💰 **成本**:
|
||
- 每次问答(10 万字上下文):约 0.15 元
|
||
- **比 RAG 方案贵 10 倍以上**
|
||
|
||
**推荐方案**:**方案一(RAG)** 为主,方案二作为小规模知识库的快速方案。
|
||
|
||
---
|
||
|
||
##### 数据库设计
|
||
|
||
```sql
|
||
-- 知识库对话历史表
|
||
CREATE TABLE kb_chat_history (
|
||
chat_id INT AUTO_INCREMENT PRIMARY KEY,
|
||
kb_id INT NOT NULL COMMENT '关联知识库ID',
|
||
user_id INT NOT NULL COMMENT '用户ID',
|
||
question TEXT NOT NULL COMMENT '用户提问',
|
||
answer TEXT NOT NULL COMMENT 'AI回答',
|
||
sources JSON COMMENT '回答来源(JSON数组)',
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (kb_id) REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
|
||
INDEX idx_kb_user (kb_id, user_id),
|
||
INDEX idx_created_at (created_at)
|
||
);
|
||
|
||
-- 知识库向量块表
|
||
CREATE TABLE kb_text_chunks (
|
||
chunk_id INT AUTO_INCREMENT PRIMARY KEY,
|
||
kb_id INT NOT NULL COMMENT '关联知识库ID',
|
||
chunk_text TEXT NOT NULL COMMENT '文本块内容',
|
||
chunk_metadata JSON COMMENT '元数据(章节、页码等)',
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (kb_id) REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||
INDEX idx_kb_id (kb_id)
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
### 5. 前端交互升级
|
||
|
||
#### 5.1 新增页面/组件
|
||
|
||
```
|
||
知识库详情页
|
||
├── 📄 内容展示区
|
||
│ ├── Markdown 渲染(已有)
|
||
│ └── 音频播放器(新增)
|
||
│ ├── 播放/暂停
|
||
│ ├── 进度条
|
||
│ ├── 倍速调节
|
||
│ └── 下载音频
|
||
│
|
||
├── 💬 智能问答区(新增)
|
||
│ ├── 对话输入框
|
||
│ ├── 对话历史列表
|
||
│ ├── 来源引用卡片
|
||
│ └── 相关问题推荐
|
||
│
|
||
└── 📊 知识库信息
|
||
├── 来源文件列表(新增)
|
||
└── 标签、创建时间等(已有)
|
||
```
|
||
|
||
#### 5.2 技术实现
|
||
|
||
```jsx
|
||
// 音频播放器组件
|
||
import ReactAudioPlayer from 'react-audio-player';
|
||
|
||
const KnowledgeAudioPlayer = ({ audioUrl }) => {
|
||
return (
|
||
<div className="audio-player-container">
|
||
<h3>🎧 音频概览</h3>
|
||
<ReactAudioPlayer
|
||
src={audioUrl}
|
||
controls
|
||
autoPlay={false}
|
||
controlsList="nodownload"
|
||
/>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
// 智能问答组件
|
||
const KnowledgeChatbot = ({ kbId }) => {
|
||
const [messages, setMessages] = useState([]);
|
||
const [input, setInput] = useState('');
|
||
const [loading, setLoading] = useState(false);
|
||
|
||
const handleAsk = async () => {
|
||
setLoading(true);
|
||
const response = await apiClient.post(`/knowledge-bases/${kbId}/ask`, {
|
||
question: input,
|
||
chat_history: messages
|
||
});
|
||
|
||
setMessages([
|
||
...messages,
|
||
{ role: 'user', content: input },
|
||
{
|
||
role: 'assistant',
|
||
content: response.data.answer,
|
||
sources: response.data.sources
|
||
}
|
||
]);
|
||
setInput('');
|
||
setLoading(false);
|
||
};
|
||
|
||
return (
|
||
<div className="chatbot-container">
|
||
<div className="chat-history">
|
||
{messages.map((msg, idx) => (
|
||
<div key={idx} className={`message ${msg.role}`}>
|
||
<div className="message-content">{msg.content}</div>
|
||
{msg.sources && (
|
||
<div className="message-sources">
|
||
<h4>📚 来源</h4>
|
||
{msg.sources.map((src, i) => (
|
||
<div key={i} className="source-card">
|
||
<strong>{src.section}</strong>
|
||
<p>{src.text}...</p>
|
||
</div>
|
||
))}
|
||
</div>
|
||
)}
|
||
</div>
|
||
))}
|
||
</div>
|
||
<div className="chat-input">
|
||
<input
|
||
value={input}
|
||
onChange={(e) => setInput(e.target.value)}
|
||
placeholder="向知识库提问..."
|
||
onKeyPress={(e) => e.key === 'Enter' && handleAsk()}
|
||
/>
|
||
<button onClick={handleAsk} disabled={loading}>
|
||
{loading ? '思考中...' : '发送'}
|
||
</button>
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 2 技术依赖汇总
|
||
|
||
### 新增 Python 依赖
|
||
```txt
|
||
# 文档解析
|
||
PyPDF2==3.0.1
|
||
pdfplumber==0.10.3
|
||
python-docx==1.1.0
|
||
|
||
# 音频处理
|
||
ffmpeg-python==0.2.0
|
||
pydub==0.25.1
|
||
|
||
# 向量数据库(二选一)
|
||
qdrant-client==1.7.0 # 推荐:轻量级向量库
|
||
# 或
|
||
pgvector==0.2.3 # 备选:PostgreSQL 扩展
|
||
|
||
# 阿里云 Embedding(可选,通义千问已集成)
|
||
# 无需新增依赖,使用现有 dashscope
|
||
```
|
||
|
||
### 新增前端依赖
|
||
```json
|
||
{
|
||
"react-audio-player": "^0.17.0",
|
||
"react-markdown": "^9.0.0" // 已有
|
||
}
|
||
```
|
||
|
||
### 基础设施
|
||
- **向量数据库**:Qdrant(Docker 部署)
|
||
```bash
|
||
docker run -p 6333:6333 qdrant/qdrant
|
||
```
|
||
- **音频处理**:FFmpeg(系统依赖)
|
||
```bash
|
||
apt-get install ffmpeg # Ubuntu
|
||
brew install ffmpeg # macOS
|
||
```
|
||
|
||
---
|
||
|
||
## 成本预估(Phase 2)
|
||
|
||
### 开发成本
|
||
| 模块 | 工作量(人天) | 说明 |
|
||
|------|---------------|------|
|
||
| 文件上传与解析 | 3-5 天 | PDF、Word、音频解析 |
|
||
| 提示词升级 | 2-3 天 | 附加提示词、结构化输出 |
|
||
| 基础 TTS | 2-3 天 | 文字转语音 |
|
||
| 播客对话(可选) | 5-7 天 | LLM 脚本生成 + 多音色合成 |
|
||
| RAG 问答系统 | 5-7 天 | 向量化、检索、对话 |
|
||
| 前端交互升级 | 3-5 天 | 音频播放器、聊天界面 |
|
||
| **总计** | **20-30 天** | 约 1-1.5 个月 |
|
||
|
||
### 运营成本(月)
|
||
| 项目 | 预估用量 | 单价 | 月成本 |
|
||
|------|---------|------|--------|
|
||
| **阿里云 TTS** | 100 万字 | 0.02 元/千字 | 20 元 |
|
||
| **LLM 脚本生成** | 50 次(5000 字/次) | 0.05 元/次 | 2.5 元 |
|
||
| **Embedding 向量化** | 100 万字 | 0.0007 元/千 tokens | 0.7 元 |
|
||
| **LLM 问答** | 1000 次 | 0.01 元/次 | 10 元 |
|
||
| **七牛云存储(音频)** | 10 GB | 0.148 元/GB/天 | 44 元 |
|
||
| **Qdrant 服务器** | 1 核 2G | - | 0 元(自建) |
|
||
| **总计** | - | - | **约 77 元/月** |
|
||
|
||
*注:基于中小规模使用场景(月活 100-500 用户)*
|
||
|
||
---
|
||
|
||
## 技术风险与缓解措施
|
||
|
||
### 风险 1:向量数据库性能
|
||
- **风险**:大规模知识库检索延迟
|
||
- **缓解**:
|
||
- 使用 Qdrant 的分片和副本
|
||
- 限制单次检索 Top-K 数量
|
||
- 增加缓存层(Redis)
|
||
|
||
### 风险 2:播客生成质量
|
||
- **风险**:LLM 生成的对话脚本不自然
|
||
- **缓解**:
|
||
- 提供多个脚本模版供用户选择
|
||
- 支持用户编辑脚本后再合成
|
||
- 引入少样本学习(Few-shot)优化 prompt
|
||
|
||
### 风险 3:文件解析准确性
|
||
- **风险**:PDF、Word 解析失败或乱码
|
||
- **缓解**:
|
||
- 提供预览功能,让用户确认提取结果
|
||
- 支持手动文本粘贴作为备选
|
||
- 增加 OCR 处理扫描件 PDF
|
||
|
||
### 风险 4:成本控制
|
||
- **风险**:TTS 和 LLM 调用费用超预算
|
||
- **缓解**:
|
||
- 设置单用户每日调用限额
|
||
- 音频生成采用队列异步处理
|
||
- 提供缓存机制避免重复生成
|
||
|
||
---
|
||
|
||
## 实施建议
|
||
|
||
### Phase 2.1(基础版,2-3 周)
|
||
✅ **优先级高**
|
||
1. 文件上传与解析(PDF、Word、TXT)
|
||
2. 基础 TTS 音频生成
|
||
3. 提示词附加功能
|
||
|
||
### Phase 2.2(进阶版,3-4 周)
|
||
🎯 **优先级中**
|
||
1. RAG 问答系统(向量检索)
|
||
2. 播客式对话生成
|
||
3. 前端聊天界面
|
||
|
||
### Phase 2.3(优化版,2-3 周)
|
||
🔧 **优先级低**
|
||
1. 音频后处理(背景音乐、片头片尾)
|
||
2. 多轮对话记忆
|
||
3. 相关问题推荐
|
||
|
||
---
|
||
|
||
## 总结
|
||
|
||
Phase 2 升级将把 iMeeting 知识库系统从"被动阅读"升级为"主动交互",核心亮点包括:
|
||
1. ✅ **多源输入**:会议 + 文件 + 音视频
|
||
2. 🎙️ **音频播客**:类 NotebookLM 的对话式音频
|
||
3. 💬 **智能问答**:基于 RAG 的精准问答
|
||
4. 📊 **结构化输出**:自动生成多级章节
|
||
|
||
**技术可行性**:高(基于成熟技术栈)
|
||
**成本可控性**:高(月运营成本 < 100 元)
|
||
**开发周期**:1-1.5 个月(20-30 人天)
|
||
|
||
建议采用**分阶段迭代**方式,先上线基础版(文件上传 + 基础 TTS),快速验证用户需求,再逐步完善高级功能(播客对话 + RAG 问答)。
|