From de1ffa7f7cd3dc0ee199495671c4b4e1db7d16f5 Mon Sep 17 00:00:00 2001 From: wizardchen Date: Fri, 19 Dec 2025 22:17:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=A1=86=E5=86=85=E9=80=89=E6=8B=A9=E7=9F=A5=E8=AF=86=E5=BA=93?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=EF=BC=8C=E4=BC=98=E5=8C=96=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.yaml | 50 +- frontend/src/api/chat/streame.ts | 6 +- frontend/src/api/knowledge-base/index.ts | 6 +- frontend/src/components/Input-field.vue | 845 ++++++++++++++---- frontend/src/components/MentionSelector.vue | 243 +++++ frontend/src/i18n/locales/en-US.ts | 4 + frontend/src/i18n/locales/ru-RU.ts | 4 + frontend/src/i18n/locales/zh-CN.ts | 7 + frontend/src/stores/settings.ts | 29 +- frontend/src/utils/caret.ts | 58 ++ .../chat/components/AgentStreamDisplay.vue | 21 +- frontend/src/views/chat/index.vue | 14 +- frontend/src/views/creatChat/creatChat.vue | 9 +- internal/agent/engine.go | 5 + internal/agent/prompts.go | 112 ++- internal/agent/tools/grep_chunks.go | 19 +- internal/agent/tools/knowledge_search.go | 127 +-- internal/application/repository/knowledge.go | 55 ++ .../application/repository/knowledgebase.go | 12 + .../retriever/elasticsearch/v7/repository.go | 13 + .../retriever/elasticsearch/v8/repository.go | 14 + .../retriever/postgres/repository.go | 33 +- .../repository/retriever/qdrant/repository.go | 11 +- internal/application/service/agent_service.go | 89 +- .../service/chat_pipline/extract_entity.go | 63 +- .../service/chat_pipline/rerank.go | 109 ++- .../service/chat_pipline/search.go | 223 ++++- .../service/chat_pipline/search_entity.go | 95 +- .../service/chat_pipline/search_parallel.go | 2 + internal/application/service/evaluation.go | 13 +- internal/application/service/knowledge.go | 10 + internal/application/service/knowledgebase.go | 2 + internal/application/service/session.go | 210 +++-- internal/handler/initialization.go | 2 +- internal/handler/knowledge.go | 34 + .../handler/session/agent_stream_handler.go | 7 +- internal/handler/session/qa.go | 44 +- internal/handler/session/stream.go | 52 +- internal/handler/session/types.go | 1 + internal/router/router.go | 2 + internal/types/agent.go | 3 + internal/types/chat_manage.go | 37 +- internal/types/embedding.go | 1 + internal/types/interfaces/knowledge.go | 4 + internal/types/interfaces/knowledgebase.go | 9 + internal/types/interfaces/session.go | 3 +- internal/types/knowledge.go | 2 + internal/types/retriever.go | 2 + internal/types/search.go | 51 +- 49 files changed, 2246 insertions(+), 521 deletions(-) create mode 100644 frontend/src/components/MentionSelector.vue create mode 100644 frontend/src/utils/caret.ts diff --git a/config/config.yaml b/config/config.yaml index c7669909c..5f8a19e28 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -11,30 +11,18 @@ conversation: vector_threshold: 0.5 rerank_threshold: 0.5 rerank_top_k: 5 - fallback_strategy: "fixed" + fallback_strategy: "model" fallback_response: "抱歉,我无法回答这个问题。" fallback_prompt: | - 你是一个专业、友好的AI助手。现在用户提出的问题超出了你的知识库范围,你需要生成一个礼貌且有帮助的回复。 + 你是一个专业、友好的AI助手。请根据你的知识直接回答用户的问题。 ## 回复要求 - - 诚实承认你无法提供准确答案 - - 简洁友好,不要过度道歉 - - 可以提供相关的建议或替代方案 - - 回复控制在50字以内 + - 直接回答用户的问题 + - 简洁清晰,言之有物 + - 如果涉及实时数据或个人隐私信息,诚实说明无法获取 - 使用礼貌、专业的语气 - ## Few-shot示例 - - 用户问题: 今天杭州西湖的游客数量是多少? - 回复: 抱歉,我无法获取实时的杭州西湖游客数据。您可以通过杭州旅游官网或相关APP查询这一信息。 - - 用户问题: 张教授的新论文发表了吗? - 回复: 我没有张教授的最新论文信息。建议您查询学术数据库或直接联系张教授获取最新动态。 - - 用户问题: 我的银行卡号是多少? - 回复: 作为AI助手,我无法获取您的个人银行信息。请登录您的银行APP或联系银行客服获取相关信息。 - - ## 用户当前的问题是: + ## 用户的问题是: {{.Query}} enable_rewrite: true enable_query_expansion: true @@ -175,28 +163,14 @@ conversation: ## 以下是用户给出的文章相关信息: generate_session_title_prompt: | - 你是一个专业的会话标题生成助手,你的任务是为用户提问创建简洁、精准且具描述性的标题。 + 根据用户的问题,生成一个简短的会话标题。 - ## 格式要求 - - 标题长度必须在10个字以内 - - 标题应准确反映用户问题的核心主题 - - 使用名词短语结构,避免使用问句 - - 保持简洁明了,删除非必要词语 - - 不要使用"关于"、"如何"等冗余词语开头 - - 直接输出标题文本,不要有任何前缀、解释或标点符号 + 要求: + - 5-10个字 + - 提取核心主题 + - 只输出标题,无需解释 - ## Few-shot示例 - - 用户问题: 如何提高英语口语水平? - 标题: 英语口语提升 - - 用户问题: 最近上海有什么好玩的展览活动? - 标题: 上海展览推荐 - - 用户问题: 苹果手机电池不耐用怎么解决? - 标题: 苹果电池优化 - - ## 用户的问题是: + 用户问题: summary: repeat_penalty: 1.0 temperature: 0.3 diff --git a/frontend/src/api/chat/streame.ts b/frontend/src/api/chat/streame.ts index 2d3d2ba73..4516f87a5 100644 --- a/frontend/src/api/chat/streame.ts +++ b/frontend/src/api/chat/streame.ts @@ -28,7 +28,7 @@ export function useStream() { let renderTimer: number | null = null // 启动流式请求 - const startStream = async (params: { session_id: any; query: any; knowledge_base_ids?: string[]; agent_enabled?: boolean; web_search_enabled?: boolean; summary_model_id?: string; mcp_service_ids?: string[]; method: string; url: string }) => { + const startStream = async (params: { session_id: any; query: any; knowledge_base_ids?: string[]; knowledge_ids?: string[]; agent_enabled?: boolean; web_search_enabled?: boolean; summary_model_id?: string; mcp_service_ids?: string[]; method: string; url: string }) => { // 重置状态 output.value = ''; error.value = null; @@ -85,6 +85,10 @@ export function useStream() { if (params.knowledge_base_ids !== undefined && params.knowledge_base_ids.length > 0) { postBody.knowledge_base_ids = params.knowledge_base_ids; } + // Include knowledge_ids if provided + if (params.knowledge_ids !== undefined && params.knowledge_ids.length > 0) { + postBody.knowledge_ids = params.knowledge_ids; + } // Include web_search_enabled if provided if (params.web_search_enabled !== undefined) { postBody.web_search_enabled = params.web_search_enabled; diff --git a/frontend/src/api/knowledge-base/index.ts b/frontend/src/api/knowledge-base/index.ts index 236a6e1e7..7c5f1cb34 100644 --- a/frontend/src/api/knowledge-base/index.ts +++ b/frontend/src/api/knowledge-base/index.ts @@ -230,4 +230,8 @@ export interface FAQImportProgress { export function getFAQImportProgress(taskId: string) { return get(`/api/v1/faq/import/progress/${taskId}`); -} \ No newline at end of file +} + +export function searchKnowledge(keyword: string, offset = 0, limit = 20) { + return get(`/api/v1/knowledge/search?keyword=${encodeURIComponent(keyword)}&offset=${offset}&limit=${limit}`); +} diff --git a/frontend/src/components/Input-field.vue b/frontend/src/components/Input-field.vue index 89b446a0a..44534ee3a 100644 --- a/frontend/src/components/Input-field.vue +++ b/frontend/src/components/Input-field.vue @@ -1,13 +1,15 @@