This commit is contained in:
zhangkunxiang 2026-07-20 11:29:22 +08:00
parent cd70022d67
commit ba5f23e24c

245
app.py
View File

@ -447,188 +447,66 @@ def dedupe_and_filter(items: List[dict], source_text: str) -> List[dict]:
return result return result
def cotprompt(query): def cotprompt(query):
conten1 = """ # 精简 Few-Shot只示范「输入文本 -> 结构化修改结果」,不再包含推理过程/思考链,
人工智能正在深刻改变现,代教育的方式通过智能教学系统AI可以根据学生的学习习惯和掌握情况提供个性化的学习内容和节奏学习内容和节奏提高学习效率同时AI还能辅助教师进行作业批改学习分析甚至参与课堂互动减轻教师的重复工作压力 # 从源头杜绝模型输出解释、分析、括号备注等多余内容,同时大幅缩短每次请求的前缀长度。
虚拟助教智能语音识别自动文达系统等技术也让远程教育更加高效和便捷更加高效和便捷随着AI技术的发展教育不再局限于固定的教材和课堂而是变得更加开放灵活和智能化------让每个雪生都能获得更适合自己的学习体验人工智能不仅是工具更是推动教育公平和质量提升的重要力量
"""
reasoning1 = """
"深刻改变现,代教育中"多了","修改为深刻改变现代教育中智能教学系统中存在错误符号修改为智能教学系统提供个性化的学习内容和节奏学习内容和节奏存在重复内容修改为"提供个性化的学习内容和节奏""自动文达系统"存在错误词语"文达"修改为自动问答系统而是变得更加开放灵活和智能化------
中存在错误符号------修改为而是变得更加开放灵活和智能化每个雪生中存在错别字雪生修改为每个学生检查完上述错误之后正确的文本内容应该是人工智能正在深刻改变现代教育的方式通过智能教学系统AI可以根据学生的学习习惯和掌握情况提供个性化的学习内容和节奏提高学习效率同时AI还能辅助教师进行作业批改学习分析甚至参与课堂互动减轻教师的重复工作压力虚拟助教智能语音识别自动问答系统等技术也让远程教育更加高效和便捷
随着AI技术的发展教育不再局限于固定的教材和课堂而是变得更加开放灵活和智能化让每个学生都能获得更适合自己的学习体验人工智能不仅是工具更是推动教育公平和质量提升的重要力量
"""
ques = f"""
文本内容为{conten1},对给出的文本内容进行逻辑校对基础校对和合规性检查逻辑校对检测文本逻辑连贯性基础校对检查文本中错别字错误标点符号和重复内容
校对文本之后如果你发现没有任何错误不需要返回其他内容只需要返回
###\n###
发现错误时返回
###\n错误错别字、标点不规范\n原文星光店电万里乌云\n建议星光点点万里无云
\n错误错别词语标点不规范\n原文请注丰收与团圆\n建议庆祝丰收与团圆
\n错误标点不规范\n原文你好明天\n建议你好明天
\n错误重复内容\n原文我听说你心情很不错不错你心情很不错不错\n建议我听说你心情很不错###
"""
conten2 = """
关于近期工作安排的通知
各位同事
京公司研九决定现将近期工作安排通知通知如下
项目推进方面各部门需加快项目进度确保按时交付如有问题及时与相关领导沟通解决项目负责人要切实履行职责加强团队协作提高工作效率
培训学习方面公司将组织系列培训课程提升员工专业技能具体时间地点另行通知员工需按时参加不得无辜缺席自即日起严禁在工作时间从事与工作无关的活动
纪律要求近期发现部分员工上班时间做与工作无关的事情如炒股聊天等严重影响工作效率和公司形象自即日起严禁在工作时间从事与工作无关的活动违反规定者将按照公司规章制度严肃处理
特此通知
[公司名称]
[日期]
"""
reasoning2 = """
"京公司研九决定"中存在错别字和词语研九修改为经公司研究决定工作安排通知通知存在重复内容修改为工作安排通知项目推进方面存在错误标点符号参与后续内容中培训学习方面因此项目推进方面之后应当使用修改为项目推进方面无辜缺席中存在错别字修改为无故缺席
纪律要求存在错别字标点不规范纪律要求应该是第三点应该使用修改为纪律要求特此通知中存在标点不规范应该修改为特此通知检查完上述错误之后正确的文本内容应该是关于近期工作安排的通知
各位同事
经公司研究决定现将近期工作安排通知如下
项目推进方面各部门需加快项目进度确保按时交付如有问题及时与相关领导沟通解决项目负责人要切实履行职责加强团队协作提高工作效率
培训学习方面公司将组织系列培训课程提升员工专业技能具体时间地点另行通知员工需按时参加不得无故缺席自即日起严禁在工作时间从事与工作无关的活动
纪律要求近期发现部分员工上班时间做与工作无关的事情如炒股聊天等严重影响工作效率和公司形象自即日起严禁在工作时间从事与工作无关的活动违反规定者将按照公司规章制度严肃处理
特此通知
[公司名称]
[日期]
"""
ques2 = f"""
文本内容为{conten2},对给出的文本内容进行逻辑校对基础校对和合规性检查逻辑校对检测文本逻辑连贯性基础校对检查文本中错别字错误标点符号和重复内容
校对文本之后如果你发现没有任何错误不需要返回其他内容只需要返回
###\n###
发现错误时返回
###\n错误错别字、标点不规范\n原文星光店电万里乌云\n建议星光点点万里无云
\n错误错别词语标点不规范\n原文请注丰收与团圆\n建议庆祝丰收与团圆
\n错误标点不规范\n原文你好明天\n建议你好明天
\n错误重复内容\n原文我听说你心情很不错不错你心情很不错不错\n建议我听说你心情很不错###
"""
conten3 = """
水声目标识别课程教学计划
课程名称
水声目标识别该课程式用于海洋科学水声工程电子信息等专业本科生asfqfqfqwfwqf研究生以及军事院校学员相关领域科研人员和企业技术人员技术人员
计划学时
2026学年总学时48学时理论授课32学时实作授课16学时
授课时间
每周4学时共12周完成
教学目标
1. 知识目标
使学生掌握水声目标识别的几本原理方法和技术包括声纳信号的特性目标特征提取分类与识别算法等
了解水声目标识别在军事如潜艇作战反潜作战等和民用如海洋资源勘探水下考古等领域的应用
熟悉水声目标识别系统的基本组成和工作原理
2. 能力目标
培养学生运用所学知识对水声信号进行分析处理特征提取和目标识别的能力
提高学生运用专业软件如MATLAB等进行水声水声信号处理和目标识别仿真的能力
增强学生解决实际水声目标识别问题的实践能力和创新思维
3. 素质目标
培养学生严谨的科学态度和扎实的专业素养使其剧备良好的团队协作精神和沟通能力
激发学生对水声技术领域的学习兴趣和探索精神培养其自主学习和终身学习的意识
"""
ques3 = f"""
文本内容为{conten3},对给出的文本内容进行逻辑校对基础校对和合规性检查逻辑校对检测文本逻辑连贯性基础校对检查文本中错别字错误标点符号和重复内容
校对文本之后如果你发现没有任何错误不需要返回其他内容只需要返回
###\n###
发现错误时返回
###\n错误错别字、标点不规范\n原文星光店电万里乌云\n建议星光点点万里无云
\n错误错别词语标点不规范\n原文请注丰收与团圆\n建议庆祝丰收与团圆
\n错误标点不规范\n原文你好明天\n建议你好明天
\n错误重复内容\n原文我听说你心情很不错不错你心情很不错不错\n建议我听说你心情很不错###
"""
reasoning3 = """
"式用"中存在错别字修改为适用本科生asfqfqfqwfwqf中存在错别字和符号asfqfqfqwfwqf修改为本科生计划学时存在错别字使用不当修改为计划学时
几本原理存在错别字标点不规范应该修改为基本原理工作原理存在标点不规范应该修改为工作原理水声水声信号中存在重复内容水声应该修改为水声信号
剧备存在错别字应该修改为具备检查完上述错误之后正确的文本内容应该是
水声目标识别课程教学计划
课程名称
水声目标识别该课程式用于海洋科学水声工程电子信息等专业本科生研究生以及军事院校学员相关领域科研人员和企业技术人员
计划学时
2026学年总学时48学时理论授课32学时实作授课16学时
授课时间
每周4学时共12周完成
教学目标
1. 知识目标
使学生掌握水声目标识别的基本原理方法和技术包括声纳信号的特性目标特征提取分类与识别算法等
了解水声目标识别在军事如潜艇作战反潜作战等和民用如海洋资源勘探水下考古等领域的应用
熟悉水声目标识别系统的基本组成和工作原理
2. 能力目标
培养学生运用所学知识对水声信号进行分析处理特征提取和目标识别的能力
提高学生运用专业软件如MATLAB等进行水声信号处理和目标识别仿真的能力
增强学生解决实际水声目标识别问题的实践能力和创新思维
3. 素质目标
培养学生严谨的科学态度和扎实的专业素养使其具备良好的团队协作精神和沟通能力
激发学生对水声技术领域的学习兴趣和探索精神培养其自主学习和终身学习的意识
"""
# 定义 Few-Shot CoT 示例
examples = [ examples = [
{ {
"question": ques, # 综合示例:覆盖错别字/错别词语/标点不规范/重复内容,
"reasoning": reasoning1, # 重点示范:多余标点(。。。)、全半角括号 -> 标点不规范(不是逻辑不通)
"answer": """ "question": "现,代教育中,智能教学系统【】让每个雪生受益,自动文达系统很方便。现就安全生产大检查工作提出如下意见。。。(本报记者 小陈)",
\n错误标点不规范\n原文,代教育\n建议现代教育 "answer": (
\n错误标点不规范\n原文智能教学系统\n建议智能教学系统 "###\n"
\n错误重复内容\n原文提供个性化的学习内容和节奏学习内容和节奏\n建议提供个性化的学习内容和节奏 "错误:标点不规范\n原文:现,代教育\n建议:现代教育\n\n"
\n错误错别字错别词语\n原文自动文达系统\n建议自动问答系统 "错误:标点不规范\n原文:智能教学系统【】\n建议:智能教学系统\n\n"
\n错误标点不规范\n原文而是变得更加开放灵活和智能化------\n建议而是变得更加开放灵活和智能化 "错误:错别字\n原文:每个雪生\n建议:每个学生\n\n"
\n错误错别字错别词语\n原文每个雪生\n建议每个学生 "错误:错别词语\n原文:自动文达系统\n建议:自动问答系统\n\n"
""" "错误:标点不规范\n原文:如下意见。。。\n建议:如下意见。\n\n"
"错误:标点不规范\n原文:(本报记者 小陈)\n建议:(本报记者 小陈)\n"
"###"
),
}, },
{ {
"question": ques2, # 删除类示例:整段重复/冗余内容应删除时,建议字段留空(表示删除),
"reasoning": reasoning2, # 严禁写“(删除该句……)”之类说明文字,否则前端替换会把说明插入原文。
"answer": """ "question": "综上,各相关部门应认真履行尽责,扎实推进工作落实见效落地。综上,各相关部门应认真履行尽责,扎实推进工作落实见效落地。",
\n错误错别字错别词语\n原文京公司研九决定\n建议经公司研究决定 "answer": (
\n错误重复内容\n原文工作安排通知通知\n建议工作安排通知 "###\n"
\n错误错别字错别词语\n原文无辜缺席\n建议无故缺席 "错误:重复内容\n原文:综上,各相关部门应认真履行尽责,扎实推进工作落实见效落地。\n建议:\n"
\n错误错别字标点不规范\n原文纪律要求\n建议纪律要求 "###"
\n错误标点不规范\n原文特此通知\n建议特此通知 ),
"""
}, },
{ {
"question": ques3, # 无明显错误示例:只返回空标记,禁止输出任何说明、分析或括号备注
"reasoning": reasoning3, "question": "全年审核采购合同、对账单据数百份,均按规定完成登记归档。",
"answer": """ "answer": "###\n###",
\n错误错别字错别词语\n原文式用\n建议适用 },
\n错误错别字错别字符\n原文本科生asfqfqfqwfwqf\n建议本科生
\n错误错别字逻辑不顺\n原文计划学时\n建议计划学时
\n错误错别字标点不规范\n原文几本原理\n建议基本原理
\n错误标点不规范\n原文工作原理\n建议工作原理
\n错误重复内容\n原文水声水声信号\n建议水声信号
\n错误错别字错别词语\n原文剧备\n建议具备
"""
}
] ]
# 定义单个示例的模板 # 单个示例模板:只保留 问题/答案,删除“推理过程”
example_template = """
问题: {question}
推理过程: {reasoning}
答案: {answer}
"""
# 创建 PromptTemplate 对象
example_prompt = PromptTemplate( example_prompt = PromptTemplate(
input_variables=["question", "reasoning", "answer"], input_variables=["question", "answer"],
template=example_template template="问题:{question}\n答案:{answer}",
) )
# 创建 FewShotPromptTemplate 对象
few_shot_prompt = FewShotPromptTemplate( few_shot_prompt = FewShotPromptTemplate(
examples=examples, examples=examples,
example_prompt=example_prompt, example_prompt=example_prompt,
prefix="你是一个文本内容校对高手。能够根据要要求进行错误检查。请根据以下示例,解决用户提出的问题。", prefix=(
suffix="问题: {question}\n推理过程:", "你是专业文本校对专家,只检查错别字、错误标点、重复内容、逻辑不通与合规问题。\n"
"输出规则(务必严格遵守):\n"
"1. 每个错误占三行:第一行“错误:<错误类型>”,第二行“原文:<有错的原文片段>”,第三行“建议:<修改后的正确文本>”;不同错误之间空一行,整体用 ### 包裹。\n"
"2. 错误类型只能从以下选择:错别字、错别词语、标点不规范、重复内容、逻辑不通、合规问题。\n"
"3. 凡是标点问题(多余或重复标点如“。。。”、全角/半角标点混用如英文括号()应为中文()、标点缺失或误用),一律归为“标点不规范”,禁止归为“逻辑不通”;“逻辑不通”只用于前后文语义矛盾、指代不清等真正的逻辑问题。\n"
"4. 建议字段只写修改后的正确内容,禁止输出任何解释、分析、推理、评论或括号备注(例如禁止出现“(删除该句……)”“(此处无明显错误……)”“(通常……可接受)”这类内容)。\n"
"5. 删除类错误(重复插入、冗余整句等需要删掉的内容):建议字段一律留空,即“建议:”后不写任何字符,用留空表示该原文片段应被删除;绝不能写“(删除)”或删除原因。\n"
"6. 若整段文本没有任何错误,只返回:###\n###,不要输出其它任何字符。\n"
"请参照以下示例完成校对:"
),
suffix="问题:{question}\n答案:",
input_variables=["question"], input_variables=["question"],
example_separator="\n\n" example_separator="\n\n",
) )
prompt = few_shot_prompt.format(question=query) return few_shot_prompt.format(question=query)
return prompt
def build_review_prompt(types: List[str], content: str, require: Optional[str]) -> Iterable[ChatCompletionMessageParam]: def build_review_prompt(types: List[str], content: str, require: Optional[str]) -> Iterable[ChatCompletionMessageParam]:
@ -650,6 +528,8 @@ def build_review_prompt(types: List[str], content: str, require: Optional[str])
query = f""" query = f"""
我会给你对应的文本进行相应的检查{review_t} 我会给你对应的文本进行相应的检查{review_t}
{require_text} {require_text}
注意只输出结构化校对结果错误/原文/建议建议只写修改后的正确文本不要输出任何解释分析推理或括号备注没有错误时只返回 ###\n###。
其中标点问题多余/重复标点全半角括号混用等一律归为标点不规范不要归为逻辑不通需要删除的重复或冗余内容建议字段留空表示删除禁止写删除之类文字
""" """
query1 = cotprompt(content) query1 = cotprompt(content)
return [ return [
@ -749,6 +629,11 @@ def build_review_stream_require(
return "\n".join(requirements) return "\n".join(requirements)
# /Review 流式并发配置:块大小 5000最多 5 块并行
REVIEW_CHUNK_SIZE = 5000
REVIEW_MAX_CONCURRENCY = 5
async def stream_review_content( async def stream_review_content(
content: str, content: str,
types: List[str], types: List[str],
@ -764,21 +649,35 @@ async def stream_review_content(
positive_words=positive_words, positive_words=positive_words,
) )
chunk_size = 1000
chunks = [ chunks = [
content[i:i + chunk_size] content[i:i + REVIEW_CHUNK_SIZE]
for i in range(0, len(content), chunk_size) for i in range(0, len(content), REVIEW_CHUNK_SIZE)
] ]
if not chunks:
return
for chunk in chunks: semaphore = asyncio.Semaphore(REVIEW_MAX_CONCURRENCY)
async def process_chunk(chunk: str) -> str:
async with semaphore:
prompt = build_review_prompt( prompt = build_review_prompt(
content=chunk, content=chunk,
types=types, types=types,
require=review_require, require=review_require,
) )
# 累积单块完整输出后再返回:并发块之间不能交错 token
# 否则会破坏“错误/原文/建议”块结构,导致后端解析错乱。
return await call_review_model(prompt)
tasks = [asyncio.create_task(process_chunk(chunk)) for chunk in chunks]
# 谁先完成谁先产出(块间顺序不保证;校对条目相互独立,前端按原文定位)
for finished in asyncio.as_completed(tasks):
chunk_result = await finished
if chunk_result and chunk_result.strip():
yield chunk_result
yield "\n\n" # 块间分隔,避免相邻块内容被后端按 \n\n 粘连
async for token in stream_review_model(prompt):
yield token
async def review_chunk( async def review_chunk(
@ -808,7 +707,7 @@ async def review_text(
negative_word_set = normalize_words(negative_words) negative_word_set = normalize_words(negative_words)
positive_word_set = normalize_words(positive_words) positive_word_set = normalize_words(positive_words)
chunk_size = 1000 chunk_size = REVIEW_CHUNK_SIZE
chunks = [ chunks = [
content[i:i + chunk_size] content[i:i + chunk_size]
for i in range(0, len(content), chunk_size) for i in range(0, len(content), chunk_size)