- 为 AI 聊天和知识库插件添加元信息配置 - 简化插件命令配置,移除冗余别名 - 更新 Discord 适配器的 Redis 频道名称 - 增强向量数据库管理器的日志信息
93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
群聊知识库插件,支持向量数据库检索
|
|
"""
|
|
import time
|
|
import uuid
|
|
from core.managers.command_manager import matcher
|
|
from models.events.message import GroupMessageEvent
|
|
from core.managers.vectordb_manager import vectordb_manager
|
|
from core.utils.logger import ModuleLogger
|
|
from core.permission import Permission
|
|
|
|
logger = ModuleLogger("GroupKnowledgeBase")
|
|
|
|
__plugin_meta__ = {
|
|
"name": "群聊知识库",
|
|
"description": "基于向量数据库的群聊知识库,支持语义检索",
|
|
"usage": "/kb_add <问题> <答案> - 添加知识库条目 (仅管理员)\n/kb_search <关键词> - 搜索知识库"
|
|
}
|
|
|
|
@matcher.command("kb_add", permission=Permission.ADMIN)
|
|
async def kb_add_command(event: GroupMessageEvent, args: list[str]):
|
|
"""添加知识库条目"""
|
|
if len(args) < 2:
|
|
await event.reply("用法: /kb_add <问题> <答案>")
|
|
return
|
|
|
|
question = args[0]
|
|
answer = " ".join(args[1:])
|
|
group_id = event.group_id
|
|
|
|
try:
|
|
collection_name = f"knowledge_base_{group_id}"
|
|
doc_id = str(uuid.uuid4())
|
|
|
|
text_to_embed = f"问题: {question}\n答案: {answer}"
|
|
metadata = {
|
|
"group_id": group_id,
|
|
"question": question,
|
|
"answer": answer,
|
|
"added_by": event.user_id,
|
|
"timestamp": int(time.time())
|
|
}
|
|
|
|
success = vectordb_manager.add_texts(
|
|
collection_name=collection_name,
|
|
texts=[text_to_embed],
|
|
metadatas=[metadata],
|
|
ids=[doc_id]
|
|
)
|
|
|
|
if success:
|
|
await event.reply(f"知识库条目添加成功!\n问题: {question}")
|
|
else:
|
|
await event.reply("知识库条目添加失败,请查看日志。")
|
|
except Exception as e:
|
|
logger.error(f"添加知识库失败: {e}")
|
|
await event.reply(f"添加失败: {str(e)}")
|
|
|
|
@matcher.command("kb_search")
|
|
async def kb_search_command(event: GroupMessageEvent, args: list[str]):
|
|
"""搜索知识库条目"""
|
|
if not args:
|
|
await event.reply("用法: /kb_search <关键词>")
|
|
return
|
|
|
|
query = " ".join(args)
|
|
group_id = event.group_id
|
|
|
|
try:
|
|
collection_name = f"knowledge_base_{group_id}"
|
|
|
|
results = vectordb_manager.query_texts(
|
|
collection_name=collection_name,
|
|
query_texts=[query],
|
|
n_results=3
|
|
)
|
|
|
|
if not results or not results.get("documents") or not results["documents"][0]:
|
|
await event.reply("未找到相关的知识库条目。")
|
|
return
|
|
|
|
reply_msg = f"为您找到以下相关知识:\n"
|
|
for i, metadata in enumerate(results["metadatas"][0], 1):
|
|
question = metadata.get("question", "")
|
|
answer = metadata.get("answer", "")
|
|
reply_msg += f"\n{i}. Q: {question}\n A: {answer}"
|
|
|
|
await event.reply(reply_msg)
|
|
except Exception as e:
|
|
logger.error(f"搜索知识库失败: {e}")
|
|
await event.reply(f"搜索失败: {str(e)}")
|