mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-06-19 22:50:22 +08:00
feat(chat): 基于 RAG 的笔记内容 AI 问答功能
实现类似 Google NotebookLM 的效果:笔记生成后自动向量化, 用户可针对笔记内容进行 LLM 问答。 ### 后端 - 新增 VectorStoreManager(ChromaDB),按标题/转录分块建立向量索引 - 新增 chat_service.py RAG 问答:检索相关片段 → 构建 prompt → 调用 LLM - 新增 /chat/index, /chat/ask, /chat/status API 端点 - 笔记生成完成后自动建立向量索引 ### 前端 - 使用 @ant-design/x Bubble.List + Sender 组件构建聊天面板 - 新增 chatStore(Zustand + persist)持久化聊天记录 - MarkdownViewer 右侧嵌入 ChatPanel,通过"AI 问答"按钮切换 - 首次打开自动检查/触发索引,支持重新索引 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
41
BillNote_frontend/src/services/chat.ts
Normal file
41
BillNote_frontend/src/services/chat.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export interface ChatMessage {
|
||||
role: 'user' | 'assistant'
|
||||
content: string
|
||||
}
|
||||
|
||||
export interface ChatSource {
|
||||
text: string
|
||||
source_type: 'markdown' | 'transcript'
|
||||
section_title?: string
|
||||
start_time?: number
|
||||
end_time?: number
|
||||
}
|
||||
|
||||
export interface AskResponse {
|
||||
answer: string
|
||||
sources: ChatSource[]
|
||||
}
|
||||
|
||||
export interface ChatStatusResponse {
|
||||
indexed: boolean
|
||||
}
|
||||
|
||||
export const indexTask = async (taskId: string): Promise<void> => {
|
||||
return await request.post('/chat/index', { task_id: taskId })
|
||||
}
|
||||
|
||||
export const askQuestion = async (data: {
|
||||
task_id: string
|
||||
question: string
|
||||
history: ChatMessage[]
|
||||
provider_id: string
|
||||
model_name: string
|
||||
}): Promise<AskResponse> => {
|
||||
return await request.post('/chat/ask', data, { timeout: 60000 })
|
||||
}
|
||||
|
||||
export const getChatStatus = async (taskId: string): Promise<ChatStatusResponse> => {
|
||||
return await request.get(`/chat/status?task_id=${taskId}`)
|
||||
}
|
||||
Reference in New Issue
Block a user