diff --git a/README.md b/README.md index 06e4716..ba3337f 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,37 @@ 完成wiki网页爬取和向量化与知识库查找 - ## 当前状况 -1. 当前在我的电脑本地跑,没部署,看chenwei有没有空了教我往我们服务器上,我自己买的学生服务器还没来得及放上去,三月份到期 -2. 这个demo后端只实现了功能没有auth相关的部分,后续可以直接迁移,chenwei那边gtco_ai开一个模块放进去 -3. firecrawl的apikey,我自己的免费试用apikey快用完了,需要准备部署,调查付费 -4. 可演示,但是还没有包装到可以向客户汇报的层次,后续考虑直接用dify做一个工具包装,集成到Done的bot里;或者用chatflow直接包装,里面用节点请求部署好的后端进行知识库查询 +1. chunk分段逻辑:根据返回的markdown进行分割,按照#、##进行标题的分类,增加JSONB格式字段meta_info,有下面两个字段,分别可以用于数据库查询和LLM上下文认知资料来源 + + ```python + # 源数据 (headers) + headers = {"h1": "产品介绍", "h2": "核心功能", "h3": "多语言支持"} + + # 生成数据 (header_path) + # Python 代码逻辑: " > ".join(headers.values()) + header_path = "产品介绍 > 核心功能 > 多语言支持" + ``` +2. 量化指标以及测试:目前存入的数据较少,测试结果可能偏差较大 + + ``` + "p_at_1": [], # Precision@1: 首位精确率 + "hit_at_5": [], # HitRate@5: 前5命中率,即返回的前五个(目前设置只返回5个)是否符合问题 + "mrr": [], # Mean Reciprocal Rank: 倒数排名分数,正确答案排得越靠前,分数越高 + "latency": [] # 响应耗时 + ``` +3. 搜索逻辑和问题分类:目前参考一些主流的做法,用户输入后先过一个LLM对问题进行拆分和分类,然后传入对应的知识库参数task_id进行对应的检索 +4. RAG逻辑:混合检索,使用向量和关键词混合检索,此处进行粗筛,数据层返回后在业务层调用 gte-rerank 模型进行重排,最后返回请求 + + ```python + vector_score = (1 - self.db.chunks.c.embedding.cosine_distance(query_vector))# 计算向量相似度 + keyword_score = func.ts_rank(self.db.chunks.c.content_tsvector, keyword_query) # 计算关键词相似度 + final_score = (vector_score * 0.7 + func.coalesce(keyword_score, 0) * 0.3).label("score")# 计算最终分数 + ``` +5. 产品面向:爬虫获取完整wiki(可无视robots.txt),当前知识库存入和爬虫绑定强,依赖markdown格式存入 + + 切割逻辑,准确率定义,归结资料,测试设计,mcp服务调用,搜索逻辑,问题分类,流程架构设计,场景假设 diff --git a/backend/services/data_service.py b/backend/services/data_service.py index cbaac1a..17ec256 100644 --- a/backend/services/data_service.py +++ b/backend/services/data_service.py @@ -102,10 +102,10 @@ class DataService: results = [] with self.db.engine.connect() as conn: - keyword_query = func.websearch_to_tsquery('english', query_text) - vector_score = (1 - self.db.chunks.c.embedding.cosine_distance(query_vector)) - keyword_score = func.ts_rank(self.db.chunks.c.content_tsvector, keyword_query) - final_score = (vector_score * 0.7 + func.coalesce(keyword_score, 0) * 0.3).label("score") + keyword_query = func.websearch_to_tsquery('english', query_text) # 转换为 tsquery + vector_score = (1 - self.db.chunks.c.embedding.cosine_distance(query_vector))# 计算向量相似度 + keyword_score = func.ts_rank(self.db.chunks.c.content_tsvector, keyword_query) # 计算关键词相似度 + final_score = (vector_score * 0.7 + func.coalesce(keyword_score, 0) * 0.3).label("score")# 计算最终分数 stmt = select( self.db.chunks.c.task_id,