Commit e7c13e3e by 文靖昊

重写与分类优化

parent a9eb1f9e
...@@ -24,7 +24,8 @@ DEFAULT_CONFIG = { ...@@ -24,7 +24,8 @@ DEFAULT_CONFIG = {
"LLM_MODEL": "Qwen2-7B", "LLM_MODEL": "Qwen2-7B",
"API_BASE": "http://192.168.10.14:8000/v1", "API_BASE": "http://192.168.10.14:8000/v1",
"TOOL_BASE_URL": "http://localhost:5001", "TOOL_BASE_URL": "http://localhost:5001",
"API_KEY": "xxxxxxxxxxxxx" "API_KEY": "xxxxxxxxxxxxx",
"LOG_LEVEL": "DEBUG"
} }
def get_config(key: str, args: Optional[argparse.Namespace] = None) -> str: def get_config(key: str, args: Optional[argparse.Namespace] = None) -> str:
......
...@@ -6,31 +6,29 @@ from ..utils.logger import get_logger ...@@ -6,31 +6,29 @@ from ..utils.logger import get_logger
class RouterQuery(BaseModel): class RouterQuery(BaseModel):
"""Route a user query to the most relevant datasource.""" """Route a user query to the most relevant datasource."""
datasource: Literal["agent", "rag", "none"] = Field( datasource: Literal["agent", "rag1", "rag2","none"] = Field(
description="给定用户的问题,选择最相关的组件来回答他们的问题。", description="给定用户的问题,选择最相关的组件来回答他们的问题。",
) )
system1 = """您是将用户问题路由到不同组件的专家。 system1 = """您是将用户问题路由到不同组件的专家,现在请根据以下四个类别对输入的问题进行分类,并输出相应的类别标签。
rag1: 地质灾害监测预警系统的构建与管理的分类,其涵盖监测预警系统的技术框架和管理实践,如监测预警的概念、目标、任务、监测对象类型、监测预警设计、仪器选择与布设、数据通信与数据库建设、工作机制建立、定期评估、监测方案设计、仪器安装与维护等。
以下是分类问题: rag2: 特定区域地质灾害监测预警体系建设的分类,其专注于某一特定区域(如海南州)的地质灾害监测预警体系建设,包括区域背景分析、地质灾害现状评估、监测预警项目的具体规划与实施、项目的组织管理、环境保护措施、经费预算等。
agent:关于特定时间段内不同地区或品牌的设备在线率查询的问题。 agent: 地区性设备与监测系统效能评估问题,例如:根据多个维度(如时间、灾害类型、设备类型)查询地区的监测点的数据、设备状态(如在线率)、处理效率(如处置率、虚警率)、预警等级等。
rag: - 在某段时间范围内,不同地区的[环境指标/地理事件/地理特征]的问题 none: 其他问题
none: - 其他问题
以下是示例: 以下是示例:
``` 问题: 2024年10月15,北京市的设备在线率是多少?
用户的输入样本匹配的数据源: 分类: agent,因为这是地区性设备评估问题
----------------
1. ** 查询 ** : “2024年8月1日,全国总的设备在线率是多少?” 问题: 自建CORS组网基准站观测墩的建造要求是什么?
- ** 匹配的分类问题 ** : agent组件类,因为这是定时间段内的设备在线率查询。 分类: rag1,因为这属于灾害监测预警系统的构建,涉及到预警系统的要求
----------------
2. ** 查询 ** : “攸县近五天降雨量如何” 问题: 海南州地质灾害发育现状?
- ** 匹配的数据源 ** : rag组件,因为这是环境指标问题。 分类: rag2,因为这属于具体建设体系中的地质灾害现状评估
----------------
3. ** 查询 ** : “介绍一下武汉” 问题: 介绍一下武汉
- ** 匹配的数据源 ** : none组件,因为这是其他问题,可以之间通过大模型获取答案。 分类:none组件,因为这是其他问题,
``` ----------------
您必须从关键词或问题的结构中推断用户的查询意图,并将其路由到相关分类组件
""" """
......
PROMPT_QUERY_REWRITE = """作为一个向量检索助手,你的任务是结合历史记录,对“原问题”进行优化,从而提高向量检索的语义丰富度,提高向量检索的精度。生成的问题要求指向对象清晰明确,并与“原问题语言相同”。例如 PROMPT_QUERY_REWRITE = """作为一个对话助手,你的任务是的作用是归纳总结和问题相关的历史对话,并优化问题。你需要做的步骤如下:
一、背景信息提取:
·请先浏览并理解对话历史记录。
·识别出与原问题最相关的部分,包括但不限于关键事件、决策点、已解答的问题及其答案等。
二、问题分析与重构:
·根据上述提取的信息,确定原问题的核心意图。
·如果发现原问题不够明确或存在歧义,请尝试重构问题,使其更加清晰、具体。
·重构时考虑是否有必要引入更多上下文来帮助更准确地定位问题。
三、相关信息整合:
·将从历史对话中获得的相关信息以简洁明了的方式融入到问题重构过程中。
·目标是让最终形成的问题不仅反映了原问题的原始意图,同时也包含了有助于快速找到正确答案的所有必要细节。
四、输出格式:
·最终输出应该包含两部分内容:一是经过优化后的问题表述;二是对之前讨论过的相关要点的简短总结。
·请确保你的回答既直接又富有信息量,同时保持语言的专业性和友好性。
例如
''' '''
''' '''
原问题: 介绍下剧情。 原问题: 介绍下剧情。
...@@ -6,21 +20,23 @@ PROMPT_QUERY_REWRITE = """作为一个向量检索助手,你的任务是结合 ...@@ -6,21 +20,23 @@ PROMPT_QUERY_REWRITE = """作为一个向量检索助手,你的任务是结合
---------------- ----------------
历史记录: 历史记录:
''' '''
Q: 对话背景。 Q: 我的电脑昨天还好好的,今天早上突然就开不了机了,按电源按钮一点反应都没有。
A: 当前对话是关于 Nginx 的介绍和使用等。 A: 可能是电源插座问题,请问插座有问题吗
Q: 电源插座检查过了,也没问题
A: 那可能是电源适配器的问题,您可以尝试换一个看看。
''' '''
原问题: 怎么下载 原问题: 如果电源适配器没有问题,还有什么可能的原因?
重写后的问题: Nginx 如何怎么下载? 优化后的问题: 如果电源适配器正常工作,电脑无法开机还可能由哪些硬件故障引起?
相关背景总结: 电脑突然无法开机,已经确认电源线和插座没有问题,初步排除了电源供应方面的问题。
---------------- ----------------
历史记录: 历史记录:
''' '''
Q: 对话背景。 Q: 对话背景。
A: 当前对话是关于 Nginx 的介绍和使用等。 A: 当前对话是关于 Nginx 的介绍和使用等。
Q: 报错 "no connection"
A: 报错"no connection"可能是因为……
''' '''
原问题: 这是什么原因要怎么解决 原问题: 怎么下载
重写后的问题: Nginx报错"no connection"如何解决? 优化后的问题: Nginx 如何怎么下载?
相关背景总结: Nginx 的介绍和使用
---------------- ----------------
历史记录: 历史记录:
''' '''
...@@ -28,7 +44,8 @@ Q: 护产假多少天? ...@@ -28,7 +44,8 @@ Q: 护产假多少天?
A: 护产假的天数根据员工所在的城市而定。请提供您所在的城市,以便我回答您的问题。 A: 护产假的天数根据员工所在的城市而定。请提供您所在的城市,以便我回答您的问题。
''' '''
原问题: 沈阳 原问题: 沈阳
重写后的问题: 沈阳的护产假多少天? 优化后的问题: 沈阳的护产假多少天?
相关背景总结: 护产假的规定
---------------- ----------------
历史记录: 历史记录:
''' '''
...@@ -36,7 +53,8 @@ Q: 作者是谁? ...@@ -36,7 +53,8 @@ Q: 作者是谁?
A: FastGPT 的作者是 labring。 A: FastGPT 的作者是 labring。
''' '''
原问题: Tell me about him 原问题: Tell me about him
重写后的问题: Introduce labring, the author of FastGPT 优化后的问题: Introduce labring, the author of FastGPT
相关背景总结: FastGPT 的作者是 labring
---------------- ----------------
历史记录: 历史记录:
''' '''
...@@ -44,13 +62,15 @@ Q: 对话背景。 ...@@ -44,13 +62,15 @@ Q: 对话背景。
A: 关于 FatGPT 的介绍和使用等问题。 A: 关于 FatGPT 的介绍和使用等问题。
''' '''
原问题: 你好。 原问题: 你好。
重写后的问题: 你好 优化后的问题: 你好
相关背景总结: 关于 FatGPT 的介绍和使用等问题
---------------- ----------------
历史记录: 历史记录:
''' '''
''' '''
原问题: 北京和上海那个天气好? 原问题: 北京和上海那个天气好?
重写后的问题: 北京和上海那个天气好 优化后的问题: 北京和上海那个天气好
相关背景总结: 无
---------------- ----------------
历史记录: 历史记录:
''' '''
...@@ -60,7 +80,8 @@ A: 1. 开源 ...@@ -60,7 +80,8 @@ A: 1. 开源
3. 扩展性强 3. 扩展性强
''' '''
原问题: 介绍下第2点。 原问题: 介绍下第2点。
重写后的问题: 介绍下 FastGPT 简便的优势 优化后的问题: 介绍下 FastGPT 简便的优势
相关背景总结: FastGPT 的优势是开源,简便和扩展性强
---------------- ----------------
历史记录: 历史记录:
''' '''
...@@ -70,14 +91,17 @@ Q: 什么是 Laf? ...@@ -70,14 +91,17 @@ Q: 什么是 Laf?
A: Laf 是一个云函数开发平台。 A: Laf 是一个云函数开发平台。
''' '''
原问题: 它们有什么关系? 原问题: 它们有什么关系?
重写后的问题: FastGPT和Laf有什么关系? 优化后的问题: FastGPT和Laf有什么关系?
相关背景总结: 简单介绍了FastGPT和Laf
---------------- ----------------
历史记录: 历史记录:
''' '''
{histories} {histories}
''' '''
原问题: {query} 原问题: {query}
重写后的问题: """ 优化后的问题:
相关背景总结:
"""
from pydantic import BaseModel,Field from pydantic import BaseModel,Field
...@@ -88,7 +112,10 @@ from ..utils.logger import get_logger ...@@ -88,7 +112,10 @@ from ..utils.logger import get_logger
class ReWriterModel(BaseModel): class ReWriterModel(BaseModel):
rewriter: str = Field( rewriter: str = Field(
description="重写后的问题", description="优化后的问题",
)
summarize: str = Field(
description="相关背景总结",
) )
...@@ -110,14 +137,6 @@ class ReWriteLLM: ...@@ -110,14 +137,6 @@ class ReWriteLLM:
result = self.parser.invoke(response) result = self.parser.invoke(response)
except: except:
# 定义正则表达式模式 # 定义正则表达式模式
pattern = re.compile(r'重写后的问题:\s*(?:{\s*"rewriter"\s*:\s*"([^"]+)"\s*}|([^,]+))')
# 查找所有匹配
matches = pattern.findall(response.content)
for match in matches:
if match[0]: # 第一种情况
return match[0].strip()
elif match[1]: # 第二种情况
return match[1].strip()
return response.content return response.content
self.logger.info(f"重写后的问题: {result.rewriter}") self.logger.info(f"重写后的问题: {result.rewriter}")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment