当前位置: 首页 > news >正文

Qanything 2 0源码解析系列1:新建知识库

Qanything 2.0源码解析系列1:新建知识库

文章转载自:https://www.feifeixu.top/article/19c76951-5881-4181-bb63-4188b28d3917

如何启动qanything服务,参考 Qanything 2.0项目部署启动手把手教程

📝 逐行代码解析

handle.py中找到new_knowledge_base这个方法。

@get_time_async
async def new_knowledge_base(req: request):# local_doc_qa这个是在app.run启动之前初始化好的一个全局变量,是LocalDocQA类的类对象,是Qanything的核心类。local_doc_qa: LocalDocQA = req.app.ctx.local_doc_qa# 拿到请求参数传递的user_id的值user_id = safe_get(req, 'user_id')# 拿到请求参数传递的user_info的值,不传默认是1234user_info = safe_get(req, 'user_info', "1234")'''检查user_id和user_info的有效性1. user_id、user_info不能是None2. user_id的长度不能超过64,必须是字符串类型,只能是数字、字母、下划线的组合,且必须以字母开头3. user_info必须是纯数字'''passed, msg = check_user_id_and_user_info(user_id, user_info)if not passed:return sanic_json({"code": 2001, "msg": msg})# 将user_id和user_info拼成一个新user_iduser_id = user_id + '__' + user_infodebug_logger.info("new_knowledge_base %s", user_id)# 拿到请求参数传递的kb_name的值kb_name = safe_get(req, 'kb_name')debug_logger.info("kb_name: %s", kb_name)# 随机初始化一个默认kb_iddefault_kb_id = 'KB' + uuid.uuid4().hex# 如果请求参数中传递了kb_id,那么以请求传递的这个做为kb_id,否则以随机初始化的作为kb_idkb_id = safe_get(req, 'kb_id', default_kb_id)'''kb_id纠正, 就是在这个kb_id后面拼接一个KB_SUFFIX,如果有这个KB_SUFFIX,直接返回kb_id,如果不存在,那么:1. 如果kb_id以"_FAQ"结尾,比如KBc86eaa3f278f4ef9908780e8e558c6eb_FAQ,那么在kb_id和FAQ之间增加一个KB_SUFFIX,默认是_240625, 最终变成了如KBc86eaa3f278f4ef9908780e8e558c6eb_240625_FAQ2. 如果kb_id不以"_FAQ"结尾,直接在kb_id后面增加一个KB_SUFFIX3. 返回新的kb_id'''kb_id = correct_kb_id(kb_id)# 拿到请求参数传递的quick的值is_quick = safe_get(req, 'quick', False)if is_quick:kb_id += "_QUICK"# kb_id必须以“KB”开头if kb_id[:2] != 'KB':return sanic_json({"code": 2001, "msg": "fail, kb_id must start with 'KB'"})# 从mysql qanything数据库 KnowledgeBase表中 查看这个user_id对应的kb_id是否存在not_exist_kb_ids = local_doc_qa.milvus_summary.check_kb_exist(user_id, [kb_id])# kb_id如果存在,直接返回已存在if not not_exist_kb_ids:return sanic_json({"code": 2001, "msg": "fail, knowledge Base {} already exist".format(kb_id)})# local_doc_qa.create_milvus_collection(user_id, kb_id, kb_name)'''先从User表中检查一下User_id是否存在,如果不存在,往User表中插入一条记录,包含(user_id, user_name)这两个字段,user_name默认为None。这里官方有个bug,有人提了issue:https://github.com/netease-youdao/QAnything/issues/506. 自己先改一下代码。往KnowledgeBase表中,插入一条记录,kb_id, user_id, kb_name'''local_doc_qa.milvus_summary.new_milvus_base(kb_id, user_id, kb_name)now = datetime.now()timestamp = now.strftime("%Y%m%d%H%M")return sanic_json({"code": 200, "msg": "success create knowledge base {}".format(kb_id),"data": {"kb_id": kb_id, "kb_name": kb_name, "timestamp": timestamp}})

🤗 总结归纳

新建知识库请求传参如下:

{"user_id": "feifeixu","kb_name": "qanything2.0","kb_id": "KBb17bd2d168604a84a59abe24e855d574"
}

返回结果:

{"code": 200,"msg": "success create knowledge base KBb17bd2d168604a84a59abe24e855d574_240625","data": {"kb_id": "KBb17bd2d168604a84a59abe24e855d574_240625","kb_name": "qanything2.0","timestamp": "202409191505"}
}

新建知识库主要是写数据库的操作,主要涉及两张表:

  1. 在User表中增加user_id的记录
  2. 在KnowledgeBase中增加user_id, kb_id, kb_name的记录

📎 参考文章

http://www.lryc.cn/news/444532.html

相关文章:

  • Redis-01 入门和十大数据类型
  • IT行业的现状与未来发展趋势
  • 828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Jenkins CI/CD平台
  • 今日 leetCode 15.三数之和
  • Games101笔记-二维Transform变换(二)
  • 【洛谷】AT_abc371_c [ABC371C] Make Isomorphic 的题解
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记
  • 【Java】JVM基本组成
  • 解决【WVP服务+ZLMediaKit媒体服务】加入海康摄像头后,能发现设备,播放/点播失败,提示推流超时!
  • 淘宝商品详情接口item_get响应参数解析:props、props_list、prop_img
  • Android使用OpenCV 4.5.0实现扑克牌识别(源码分享)
  • Pandas_iloc_loc_哪个是inclusive哪个是exclusive
  • python是什么语言写的
  • python编程,把所有子目录和文件输出到文本文件
  • 使用 IntelliJ IDEA 连接到达梦数据库(DM)
  • 【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘
  • Java中的事件(动作监听-ActionListener)
  • STM32篇:开发环境安装
  • AIGC实战——多模态模型Flamingo
  • 如何在WordPress中添加事件Schema(分步指南)
  • 守护企业资产安全:企业微信群禁止互加好友操作指南!
  • 【QT基础】创建项目项目代码解释
  • 【数据结构】对象的比较
  • 代码随想录八股训练营第四十天| C++
  • 【C++】10道经典面试题带你玩转二叉树
  • 【裸机装机系列】13.kali(ubuntu)-优化-自定义grub启动界面个性化背景
  • 数组高阶应用(C++版)
  • Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试
  • 解析与实现二叉树
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)