From 9ebe92a5c546c99d723445a1ea1404e03211af5f Mon Sep 17 00:00:00 2001
From: HuangHai <10402852@qq.com>
Date: Fri, 27 Jun 2025 07:25:39 +0800
Subject: [PATCH] 'commit'
---
dsRag/494913b3598b4c73876bd7b821860973.html | 79 +++++++++++++++
dsRag/Doc/9、Pandoc下载.md | 2 +
dsRag/Start.py | 102 ++++++++++----------
dsRag/Test/TestPandoc.py | 7 ++
dsRag/static/1.html | 42 ++++++++
dsRag/static/output.docx | Bin 0 -> 12622 bytes
dsRag/小学数学问答.docx | Bin 0 -> 10353 bytes
7 files changed, 183 insertions(+), 49 deletions(-)
create mode 100644 dsRag/494913b3598b4c73876bd7b821860973.html
create mode 100644 dsRag/Doc/9、Pandoc下载.md
create mode 100644 dsRag/Test/TestPandoc.py
create mode 100644 dsRag/static/1.html
create mode 100644 dsRag/static/output.docx
create mode 100644 dsRag/小学数学问答.docx
diff --git a/dsRag/494913b3598b4c73876bd7b821860973.html b/dsRag/494913b3598b4c73876bd7b821860973.html
new file mode 100644
index 00000000..65f69b0b
--- /dev/null
+++ b/dsRag/494913b3598b4c73876bd7b821860973.html
@@ -0,0 +1,79 @@
+
+
+
+
+
“如何理解点、线、面、体、角”教学设计
+
+
+ “如何理解点、线、面、体、角”教学设计
+
+ 一、教学背景与目标
+ 基于欧几里得几何的基本概念,针对小学阶段学生认知特点,通过直观体验和操作活动帮助学生建立对点、线、面、体、角的描述性理解,重点突破“角”的概念教学难点。
+
+ 二、核心教学策略
+
+ - 从立体到抽象的认知路径:从具体物体(如长方体)中抽象出点(顶点)、线(棱)、面
+ - 描述性定义优先:避免严格数学定义,通过图形特征描述建立概念
+ - 操作体验强化理解:结合几何作图、教具演示等实践活动
+
+
+ 三、分模块教学设计
+
+ 模块1:点、线、面的认识
+
+ - 立体图形分类活动:引导学生观察不同立体模型(立方体、球体等),发现共性特征
+ - 抽象过程演示:以长方体为例演示抽象过程(顶点→点,棱→线,表面→面)
+ - 特征归纳:通过对比强调"点无大小、线无宽窄、面无薄厚"的抽象特性
+
+
+ 模块2:角的初步认识(重点模块)
+
+
阶段1:情境化引入
+
教具演示:使用无刻度钟表模型,通过时针/分针位置变化让学生感知:
+
+ - 角由两条"边"(指针)及其夹角构成
+ - 角大小决定时间辨认(如12:30与12:45的夹角差异)
+
+
+
阶段2:描述性定义建立
+
+ - 生活实例观察(书本角、桌角等),归纳特征:"边直、尖顶"
+ - 操作活动:用长方形纸折出不同角,理解"端点重合的两边所夹部分"
+ - 关键强调:角大小与边长无关,只与两边张开程度有关
+
+
+
阶段3:几何作图深化
+
+ - 尺规作图练习:绘制不同角并标注各部分名称
+ - 对比活动:通过重叠法比较角大小(如图2-b的包含关系演示)
+
+
+
+ 四、教学要点说明
+
+
+ 概念 |
+ 教学要点 |
+ 常见误区 |
+
+
+ 角 |
+ 强调"两边所夹部分",通过大小比较理解本质 |
+ 避免使用射线定义,不强调边的无限性 |
+
+
+ 线 |
+ 从直线段出发,延伸理解射线与直线 |
+ 不过分强调"直",但通过"两点间最短"感悟特性 |
+
+
+
+ 五、评价建议
+
+ - 形成性评价:观察学生在折纸、作图活动中的概念表述准确性
+ - 诊断性评价:设计角大小比较的变式练习(如边长短不同的相似角)
+
+
+ 六、拓展资源
+ 可结合《课标》例46(几何概念计数)、例58(立体图形抽象)开展跨课时整合教学。
+
diff --git a/dsRag/Doc/9、Pandoc下载.md b/dsRag/Doc/9、Pandoc下载.md
new file mode 100644
index 00000000..674e9ba8
--- /dev/null
+++ b/dsRag/Doc/9、Pandoc下载.md
@@ -0,0 +1,2 @@
+https://github.com/jgm/pandoc/releases/tag/3.7.0.2
+https://objects.githubusercontent.com/github-production-release-asset-2e65be/571770/92882bf5-3b76-4345-b08a-9d9badc74957?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250626%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250626T231242Z&X-Amz-Expires=1800&X-Amz-Signature=55493529bc6e5a3779e95bcdd9f33cf09477d3e47f9a441b9412b5b193d788db&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dpandoc-3.7.0.2-windows-x86_64.msi&response-content-type=application%2Foctet-stream
\ No newline at end of file
diff --git a/dsRag/Start.py b/dsRag/Start.py
index 7c5ed95b..3daf0a20 100644
--- a/dsRag/Start.py
+++ b/dsRag/Start.py
@@ -1,9 +1,11 @@
+import os
+import tempfile
import urllib.parse
+import uuid
from contextlib import asynccontextmanager
from io import BytesIO
from logging.handlers import RotatingFileHandler
-import html2text
import jieba # 导入 jieba 分词库
import uvicorn
from docx import Document
@@ -20,6 +22,13 @@ from Config.Config import MS_MODEL_PATH, MS_MODEL_LIMIT, MS_HOST, MS_PORT, MS_MA
from Milvus.Utils.MilvusCollectionManager import MilvusCollectionManager
from Milvus.Utils.MilvusConnectionPool import *
from Milvus.Utils.MilvusConnectionPool import MilvusConnectionPool
+import subprocess
+
+
+# 将HTML文件转换为Word文件
+def html_to_word_pandoc(html_file, output_file):
+ subprocess.run(['pandoc', html_file, '-o', output_file])
+
# 初始化日志
logger = logging.getLogger(__name__)
@@ -75,10 +84,8 @@ def text_to_embedding(text):
async def generate_stream(client, milvus_pool, collection_manager, query):
- """生成SSE流"""
# 从连接池获取连接
connection = milvus_pool.get_connection()
-
try:
# 1. 将查询文本转换为向量
current_embedding = text_to_embedding(query)
@@ -89,7 +96,7 @@ async def generate_stream(client, milvus_pool, collection_manager, query):
"params": {"nprobe": MS_NPROBE} # 设置 IVF_FLAT 的 nprobe 参数
}
# 7. 将文本转换为嵌入向量
- results = collection_manager.search(current_embedding, search_params, limit=5) # 返回 2 条结果
+ results = collection_manager.search(current_embedding, search_params, limit=5) # 返回 5 条结果
# 3. 处理搜索结果
logger.info("最相关的知识库内容:")
@@ -100,7 +107,7 @@ async def generate_stream(client, milvus_pool, collection_manager, query):
try:
# 查询非向量字段
record = collection_manager.query_by_id(hit.id)
- if hit.distance < 0.88: # 设置距离阈值
+ if hit.distance < 0.88: # 设置距离阈值
logger.info(f"ID: {hit.id}")
logger.info(f"标签: {record['tags']}")
logger.info(f"用户问题: {record['user_input']}")
@@ -144,8 +151,11 @@ async def generate_stream(client, milvus_pool, collection_manager, query):
temperature=0.3,
stream=False
)
-
- yield {"data": response.choices[0].message.content}
+ # 将返回的html代码保存成文件
+ htmlStr = response.choices[0].message.content
+ with open("Static/1.html", "w", encoding="utf-8") as f:
+ f.write(htmlStr)
+ yield {"data": htmlStr}
except Exception as e:
yield {"data": f"生成报告时出错: {str(e)}"}
finally:
@@ -168,11 +178,15 @@ http://10.10.21.22:8000/static/ai.html
class QueryRequest(BaseModel):
query: str = Field(..., description="用户查询的问题")
+
class SaveWordRequest(BaseModel):
html: str = Field(..., description="要保存为Word的HTML内容")
+
@app.post("/api/save-word")
async def save_to_word(request: Request):
+ temp_html = None
+ output_file = None
try:
# Parse request data
try:
@@ -183,52 +197,42 @@ async def save_to_word(request: Request):
except Exception as e:
logger.error(f"Request parsing failed: {str(e)}")
raise HTTPException(status_code=400, detail=f"Invalid request: {str(e)}")
-
- # Convert HTML to text
- try:
- text_maker = html2text.HTML2Text()
- text_maker.ignore_links = True
- text_maker.ignore_images = True
- text_content = text_maker.handle(html_content)
- except Exception as e:
- logger.error(f"HTML conversion failed: {str(e)}")
- raise HTTPException(status_code=400, detail=f"HTML processing error: {str(e)}")
-
- # Create Word document
- try:
- doc = Document()
- doc.add_heading('小学数学问答', 0)
-
- for para in text_content.split('\n\n'):
- if para.strip():
- doc.add_paragraph(para.strip())
- except Exception as e:
- logger.error(f"Document creation failed: {str(e)}")
- raise HTTPException(status_code=500, detail=f"Document creation error: {str(e)}")
-
- # Save to stream
- try:
- stream = BytesIO()
- doc.save(stream)
- stream.seek(0)
- except Exception as e:
- logger.error(f"Document saving failed: {str(e)}")
- raise HTTPException(status_code=500, detail=f"Document saving error: {str(e)}")
-
- # Return response
- filename = "小学数学问答.docx"
- encoded_filename = urllib.parse.quote(filename)
+
+ # 创建临时HTML文件
+ temp_html = os.path.join(tempfile.gettempdir(), uuid.uuid4().hex + ".html")
+ with open(temp_html, "w", encoding="utf-8") as f:
+ f.write(html_content)
+
+ # 使用pandoc转换
+ output_file = os.path.join(tempfile.gettempdir(), "小学数学问答.docx")
+ subprocess.run(['pandoc', temp_html, '-o', output_file], check=True)
+
+ # 读取生成的Word文件
+ with open(output_file, "rb") as f:
+ stream = BytesIO(f.read())
+
+ # 返回响应
+ encoded_filename = urllib.parse.quote("小学数学问答.docx")
return StreamingResponse(
stream,
media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
- headers={"Content-Disposition": f"attachment; filename*=UTF-8''{encoded_filename}"}
- )
-
+ headers={"Content-Disposition": f"attachment; filename*=UTF-8''{encoded_filename}"})
+
except HTTPException:
raise
except Exception as e:
logger.error(f"Unexpected error: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error")
+ finally:
+ # 清理临时文件
+ try:
+ if temp_html and os.path.exists(temp_html):
+ os.remove(temp_html)
+ if output_file and os.path.exists(output_file):
+ os.remove(output_file)
+ except Exception as e:
+ logger.warning(f"Failed to clean up temp files: {str(e)}")
+
@app.post("/api/rag")
async def rag_stream(request: Request):
@@ -243,10 +247,10 @@ async def rag_stream(request: Request):
raise HTTPException(status_code=400, detail="无效的请求格式")
"""RAG+DeepSeek接口"""
async for chunk in generate_stream(
- request.app.state.deepseek_client,
- request.app.state.milvus_pool,
- request.app.state.collection_manager,
- query_request.query
+ request.app.state.deepseek_client,
+ request.app.state.milvus_pool,
+ request.app.state.collection_manager,
+ query_request.query
):
return chunk
diff --git a/dsRag/Test/TestPandoc.py b/dsRag/Test/TestPandoc.py
new file mode 100644
index 00000000..e004310c
--- /dev/null
+++ b/dsRag/Test/TestPandoc.py
@@ -0,0 +1,7 @@
+import subprocess
+
+def html_to_word_pandoc(html_file, output_file):
+ subprocess.run(['pandoc', html_file, '-o', output_file])
+
+# 使用示例
+html_to_word_pandoc('../static/1.html', '../static/output.docx')
\ No newline at end of file
diff --git a/dsRag/static/1.html b/dsRag/static/1.html
new file mode 100644
index 00000000..cf78316b
--- /dev/null
+++ b/dsRag/static/1.html
@@ -0,0 +1,42 @@
+
+
+
+ 小学数学中的模型
+
+
+ 小学数学中的模型
+
+ 什么是模型?
+ 在小学数学中,模型是用数学的语言讲述现实世界中的故事,强调如何用数学的方法描述或解决一类现实生活中的问题。模型不仅仅是数学表达,而是能够解决一类具有实际背景问题的数学方法。
+
+ 小学数学中的主要模型
+
+ -
+
总量模型(加法模型)
+ 讨论总量与部分量之间的关系,部分量之间是并列关系,运算用加法。基本形式为:
+ 总量 = 部分量 + 部分量
+ 适用于解决图书室各类书的总和、购物总花费等问题。
+
+ -
+
路程模型(乘法模型)
+ 描述距离、速度、时间之间的关系,基本形式为:
+ 距离 = 速度 × 时间
+ 适用于解决“总价 = 单价 × 数量”、“总数 = 行数 × 列数”等问题。
+
+ -
+
植树模型
+ 问题背景是在直线或平面上有规律地挖洞植树,适用于解决资源调查、环境调查等问题。
+
+ -
+
工程模型
+ 讨论多个工程队合作完成工程的时间,基本形式为假设工程为1,适用于解决归一问题、注水问题等。
+
+
+
+ 模型的重要性
+ 模型的重要性不仅取决于数学表达是否完美,更取决于对现实世界的解释。通过模型的构建和理解,学生可以认识到数学是描述现实世界的强有力工具。
+
+ 教学建议
+ 在教学中,应通过现实例子让学生感悟模型的意义,引导学生灵活使用模型,培养学生的应用意识和创新意识。
+
+
\ No newline at end of file
diff --git a/dsRag/static/output.docx b/dsRag/static/output.docx
new file mode 100644
index 0000000000000000000000000000000000000000..bfa0714f5784e569556ca33334b31e9af90c9034
GIT binary patch
literal 12622
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