from flask import Flask, request, jsonify, render_template_string
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-6.7b-base"
model_path = r"D:\deepseek_chat\final_save_models"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path)
embedding_path = r"C:\Users\Administrator\.cache\modelscope\hub\models\sentence-transformers\all-MiniLM-L6-v2"
embedding_model = SentenceTransformer(embedding_path)
documents = ["你好", "这是第二条文档内容"]
document_embeddings = embedding_model.encode(documents)
dimension = document_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(document_embeddings))
def retrieve_documents(query, top_k=3):
query_embedding = embedding_model.encode(query)
distances, indices = index.search(np.array([query_embedding]), top_k)
retrieved_docs = [documents[i] for i in indices[0]]
return retrieved_docs
def generate_answer(query, retrieved_docs):
input_text = f"查询: {query}\n相关文档: {' '.join(retrieved_docs)}\n回答: "
input_ids = tokenizer.encode(input_text, return_tensors='pt')
output = model.generate(input_ids, max_length=200, num_beams=5, no_repeat_ngram_size=2)
answer = tokenizer.decode(output[0], skip_special_tokens=True)
return answer
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index_html():
html_template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DeepSeek RAG 问答系统</title>
</head>
<body>
<h1>DeepSeek RAG 问答系统</h1>
<form id="questionForm">
<label for="question">请输入你的问题:</label><br>
<input type="text" id="question" name="question" size="50"><br>
<input type="submit" value="提交">
</form>
<div id="answer" style="margin-top: 20px;"></div>
<script>
const form = document.getElementById('questionForm');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const question = document.getElementById('question').value;
const response = await fetch('/ask', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ query: question })
});
const data = await response.json();
const answerDiv = document.getElementById('answer');
answerDiv.innerHTML = `<p><strong>回答:</strong> ${data.answer}</p>`;
});
</script>
</body>
</html>
"""
return render_template_string(html_template)
@app.route('/ask', methods=['POST'])
def ask():
data = request.get_json()
query = data.get('query')
retrieved_docs = retrieve_documents(query,)
answer = generate_answer(query, retrieved_docs)
return jsonify({'answer': answer})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)