基于RAG技术的模型检索增强及回复
基于Neo4j图数据库的知识图谱动态查询及相应
基于FLASK的模型后端设计
在8080接口抛出FLASK后端
使用图数据库检索到的Document对模型回复进行增强
提供系统级别Prompt
self.dialog = [{'role': 'system', 'content': '你是山东大学VCRS(可视化课程知识问答系统)的AI助手,对于用户给出的问题,系统会给出参考资料.根据参考资料进行回答.'
'系统给出的知识含有问题中所含实体对应的解释$description及对应页码$page_num,你应该以如下方式回答:'
'[知识问答]\n[参考资料]\n,其中[知识问答]是你给出的回复'
'[参考资料]的格式应该像这样:1.$description\t[资料页码:$page_num] .[参考资料]由你结合自己的理解**筛选**系统给出的知识最多三条,不可以瞎编.'
'你的回答应该条理清晰且富有启发性'}]
每次调用模型后在user_query后主动增强一条system的输入,含有系统检索到的相关实体知识
举例:
user_query:
def dialog_update(self, message, role='user'):
# message should be formatted like this:
# {'role': 'user', 'content': 'You are a helpful assistant.'}
# role:'user','system','assistant'
self.dialog.append({'role': role, 'content': message})
def call(self):
response = dashscope.Generation.call(
model='qwen-max-0403',
messages=self.dialog,
result_format='message', )
if response.status_code == HTTPStatus.OK:
print(response)
return response.output.choices[0]["message"]
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
def step(self, user_query, system_prompt=''):
self.dialog_update(user_query, role='user')
print("system prompt is:", system_prompt)
self.dialog_update(system_prompt, role='system')
model_response = self.call()
self.dialog_update(model_response, role='assistant')
return model_response["content"]
每次对话后都进行实体识别和基于知识图谱的知识检索
def step(self, user_query, system_prompt=''):
self.dialog_update(user_query, role='user')
print("system prompt is:", system_prompt)
self.dialog_update(system_prompt, role='system')
model_response = self.call()
self.dialog_update(model_response, role='assistant')
return model_response["content"]
实现基于Flask的后端接口供前端请求
使用POST接口方式在本地指定url下抛出响应方法
@app.route('/show', methods=['POST'])
def query_to_node():
user_input = request.json
entity = user_input.get('query')
server = MyServer()
graphData, description, questions, expands, memos = server.execute_graph(entity)
response = {
'computerNetworkInfo': description,
'expands': expands,
'graphData': graphData,
'questions': questions,
'memos': memos
}
return response
前端只需要使用request库请求即可得到响应结果
import requests
url1 = 'http://127.0.0.1:8080/query'
data = {'query':"计算机网络的定义是什么"}
response1 = requests.post(url1, json=data)
# 打印服务器返回的响应
print(response1.text)
实现了所有后端接口,以抛出指定url下post方法的形式与Vue前端相连接,前端只需要带参(如用户此次query内容)使用requests库请求指定url即可得到后端回复。
分别实现了根据用户query使用自己设计的滑动窗口方法切分并在知识图谱中匹配实体。返回关键实体列表,可以使用实体查询知识图谱并返回关键子图,返回formatted过后的模型回复等一系列用到的所有后端接口。