main
HuangHai 3 weeks ago
parent ab851d5ec1
commit 85dae6a189

@ -62,7 +62,8 @@ async def rag(request: fastapi.Request):
# 查询的问题 # 查询的问题
query = data.get("query") query = data.get("query")
# 关闭参考资料 # 关闭参考资料
query = query + "\n 不要输出参考资料!" query = query + "\n 1、不要输出参考资料"
query = query + "\n 2、如果问题与提供的知识库内容不符则明确告诉未在知识库范围内提到"
async def generate_response_stream(query: str): async def generate_response_stream(query: str):
try: try:

@ -2231,6 +2231,26 @@
"embedding_min": null, "embedding_min": null,
"embedding_max": null, "embedding_max": null,
"original_prompt": "小学数学中有哪些模型?\n 不要输出参考资料!" "original_prompt": "小学数学中有哪些模型?\n 不要输出参考资料!"
},
"cef372244b52137466d4538968bdef8e": {
"return": "{\"high_level_keywords\": [\"\\u5fae\\u79ef\\u5206\", \"\\u57fa\\u672c\\u5b9a\\u7406\", \"\\u6570\\u5b66\\u5206\\u6790\"], \"low_level_keywords\": [\"\\u5bfc\\u6570\", \"\\u79ef\\u5206\", \"\\u725b\\u987f-\\u83b1\\u5e03\\u5c3c\\u5179\\u516c\\u5f0f\", \"\\u51fd\\u6570\", \"\\u9762\\u79ef\"]}",
"cache_type": "keywords",
"chunk_id": null,
"embedding": null,
"embedding_shape": null,
"embedding_min": null,
"embedding_max": null,
"original_prompt": "微积分的基本定理是什么?\n 不要输出参考资料!"
},
"7e5ce4bd3ec5160ecb223526b726b73d": {
"return": "{\"high_level_keywords\": [\"\\u5fae\\u79ef\\u5206\", \"\\u57fa\\u672c\\u5b9a\\u7406\", \"\\u6570\\u5b66\\u539f\\u7406\"], \"low_level_keywords\": [\"\\u5bfc\\u6570\", \"\\u79ef\\u5206\", \"\\u51fd\\u6570\", \"\\u5fae\\u5206\\u5b66\", \"\\u79ef\\u5206\\u5b66\"]}",
"cache_type": "keywords",
"chunk_id": null,
"embedding": null,
"embedding_shape": null,
"embedding_min": null,
"embedding_max": null,
"original_prompt": "微积分的基本定理是什么?\n 1、不要输出参考资料\n 2、如果问题与提供的知识库内容不符则明确告诉未在知识库范围内提到"
} }
} }
} }

@ -76,17 +76,17 @@
background-color: #2196F3; background-color: #2196F3;
} }
#saveWordBtn:hover {
background-color: #0b7dda;
}
.icon { .icon {
margin-right: 5px; margin-right: 5px;
} }
@keyframes spin { @keyframes spin {
0% { transform: rotate(0deg); } 0% {
100% { transform: rotate(360deg); } transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
} }
.doc-links { .doc-links {
@ -96,18 +96,6 @@
align-items: center; align-items: center;
} }
.doc-link {
padding: 8px 15px;
background-color: #e7f3fe;
border-radius: 4px;
color: #2196F3;
text-decoration: none;
transition: all 0.3s;
}
.doc-link:hover {
background-color: #d0e3fa;
}
.doc-checkboxes { .doc-checkboxes {
display: flex; display: flex;
@ -200,39 +188,44 @@
<div class="examples"> <div class="examples">
<div class="example-category"> <div class="example-category">
<h3>问题示例</h3> <h3>已收集问题示例</h3>
<div class="example-list"> <div class="example-list">
<div class="example-item" onclick="fillExample('小学数学中有哪些模型?')">小学数学中有哪些模型?</div> <div class="example-item" onclick="fillExample('小学数学中有哪些模型?')">小学数学中有哪些模型?</div>
<div class="example-item" onclick="fillExample('帮我写一下 "线"')"> <div class="example-item" onclick="fillExample('帮我写一下 " 线
帮我写一下 "如何理解点、线、面、体、角"的教学设计 "的教学设计')">
</div> 帮我写一下 "如何理解点、线、面、体、角"的教学设计
<div class="example-item" onclick="fillExample('苏轼的好朋友都有谁?')">苏轼的好朋友都有谁?</div>
<div class="example-item" onclick="fillExample('苏轼的家人都有谁?')">苏轼的家人都有谁</div>
<div class="example-item" onclick="fillExample('微积分的基本定理是什么?')">微积分的基本定理是什么?</div>
<div class="example-item" onclick="fillExample('线性代数在AI中的应用')">线性代数在AI中的应用</div>
</div> </div>
<div class="example-item" onclick="fillExample('苏轼的好朋友都有谁?')">苏轼的好朋友都有谁?</div>
<div class="example-item" onclick="fillExample('苏轼的家人都有谁?')">苏轼的家人都有谁</div>
</div> </div>
</div> </div>
<div class="example-category">
<div class="doc-links"> <h3>未收集问题示例</h3>
<h3>知识库范围</h3> <div class="example-item" onclick="fillExample('微积分的基本定理是什么?')">微积分的基本定理是什么?</div>
<div class="doc-checkboxes"> <div class="example-item" onclick="fillExample('线性代数在AI中的应用')">线性代数在AI中的应用</div>
<label>
<input type="radio" name="topic" value="Math" checked>
小学数学
</label>
<label>
<input type="radio" name="topic" value="Chinese">
苏轼知识
</label>
</div>
</div> </div>
</div>
</div>
<button id="submitBtn" onclick="submitQuestion()"><span class="icon">💡</span>提问</button> <div class="doc-links">
<button id="clearBtn" onclick="clearAll()"><span class="icon">🗑️</span>清空</button> <h3>知识库范围</h3>
<div class="doc-checkboxes">
<label>
<input type="radio" name="topic" value="Math" checked>
小学数学
</label>
<label>
<input type="radio" name="topic" value="Chinese">
苏轼知识
</label>
</div> </div>
</div> </div>
<button id="submitBtn" onclick="submitQuestion()"><span class="icon">💡</span>提问</button>
<button id="clearBtn" onclick="clearAll()"><span class="icon">🗑️</span>清空</button>
</div>
</div>
<script> <script>
// 在页面加载时显示加载动画 // 在页面加载时显示加载动画
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
@ -289,15 +282,15 @@
const question = document.getElementById('questionInput').value.trim(); const question = document.getElementById('questionInput').value.trim();
const answerArea = document.getElementById('answerArea'); const answerArea = document.getElementById('answerArea');
const topic = document.querySelector('input[name="topic"]:checked').value; const topic = document.querySelector('input[name="topic"]:checked').value;
if (!question) { if (!question) {
alert('请输入问题!'); alert('请输入问题!');
return; return;
} }
// 添加加载动画 // 添加加载动画
answerArea.innerHTML = '<div class="loading-animation"><div class="spinner"></div><div>思考中...</div></div>'; answerArea.innerHTML = '<div class="loading-animation"><div class="spinner"></div><div>思考中...</div></div>';
fetch('/api/rag', { fetch('/api/rag', {
method: 'POST', method: 'POST',
headers: { headers: {
@ -309,55 +302,55 @@
topic: topic topic: topic
}) })
}) })
.then(response => { .then(response => {
const reader = response.body.getReader(); const reader = response.body.getReader();
const decoder = new TextDecoder(); const decoder = new TextDecoder();
let buffer = ''; let buffer = '';
let accumulatedContent = ''; let accumulatedContent = '';
function processChunk() { function processChunk() {
return reader.read().then(({done, value}) => { return reader.read().then(({done, value}) => {
if (done) return; if (done) return;
buffer += decoder.decode(value, {stream: true}); buffer += decoder.decode(value, {stream: true});
const lines = buffer.split('\n'); const lines = buffer.split('\n');
buffer = lines.pop(); buffer = lines.pop();
for (const line of lines) { for (const line of lines) {
if (line.includes('data:')) { if (line.includes('data:')) {
const jsonStr = line.replace(/^data:\s*/, '').replace(/^data:\s*/, '').trim(); const jsonStr = line.replace(/^data:\s*/, '').replace(/^data:\s*/, '').trim();
if (jsonStr) { if (jsonStr) {
try { try {
const data = JSON.parse(jsonStr); const data = JSON.parse(jsonStr);
if (data.reply) { if (data.reply) {
accumulatedContent += data.reply; accumulatedContent += data.reply;
answerArea.innerHTML = marked.parse(accumulatedContent, markedOptions); answerArea.innerHTML = marked.parse(accumulatedContent, markedOptions);
MathJax.typesetPromise(); MathJax.typesetPromise();
}
} catch (e) {
console.log('忽略解析错误:', e);
} }
} catch (e) {
console.log('忽略解析错误:', e);
} }
} }
} }
}
return processChunk().then(() => {
return processChunk().then(() => { // 在流处理完成后保存完整的markdown内容
// 在流处理完成后保存完整的markdown内容 localStorage.setItem('lastMarkdownContent', accumulatedContent);
localStorage.setItem('lastMarkdownContent', accumulatedContent); });
}); });
}); }
}
return processChunk();
return processChunk(); })
}) .catch(error => {
.catch(error => { // 移除加载动画
// 移除加载动画 answerArea.innerHTML = '';
answerArea.innerHTML = '';
console.error('Error:', error);
console.error('Error:', error); // 出错时也移除加载动画
// 出错时也移除加载动画 answerArea.innerHTML = '<div style="color:red">请求出错,请重试</div>';
answerArea.innerHTML = '<div style="color:red">请求出错,请重试</div>'; });
});
} }
function clearAll() { function clearAll() {

Loading…
Cancel
Save