58 lines
3.0 KiB
Python
58 lines
3.0 KiB
Python
from llama_index.core import Settings
|
||
from llama_index.llms.dashscope import DashScope
|
||
from llama_index.indices.managed.dashscope import DashScopeCloudIndex
|
||
from llama_index.core.postprocessor import SimilarityPostprocessor
|
||
from llama_index.postprocessor.dashscope_rerank import DashScopeRerank
|
||
|
||
'''
|
||
本例中构建检索引擎时,需要手动设置下列参数,请根据实际效果调整。
|
||
'''
|
||
Settings.llm = DashScope(model_name="qwen-max") # 设置检索引擎生成回答时调用的大模型。
|
||
similarity_top_k = 5 # 检索引擎找到的相似度最高的结果数
|
||
similarity_cutoff = 0.4 # 过滤检索结果时使用的最低相似度阈值
|
||
top_n = 1 # 进行重排后返回语义上相关度最高的结果数
|
||
|
||
'''
|
||
本例中构建RAG应用时,设置如下问答模板,请根据实际需求调整。
|
||
'''
|
||
init_chat = "\n您好,我是AI助手,可以回答关于百炼系列产品的提问。有什么可以帮您的?(请输入问题,退出请输入'q')\n> "
|
||
resp_with_no_answer = "很抱歉,知识库未提供相关信息。" + "\n"
|
||
prompt_template = "回答如下问题: {0}\n如果根据提供的信息无法回答,请返回:{1}"
|
||
|
||
|
||
'''
|
||
格式化输出。
|
||
'''
|
||
def prettify_rag(resp):
|
||
output = ""
|
||
output += "\n回答:{0}\n".format(resp.response)
|
||
for j in range(len(resp.source_nodes)):
|
||
output += "\n产品知识库中的相关文本:\n{0}\n".format(resp.source_nodes[j].text)
|
||
return output
|
||
|
||
|
||
'''
|
||
基于云端知识库的向量索引,构建检索引擎,能够接收终端用户的提问,从云端知识库中检索相关的文本片段,再将提问和检索结果合并后输入到大模型,并生成回答。
|
||
RAG应用提供与终端用户的交互界面,如果无法检索到相关的文本片段,或根据检索到的文本片段无法回答终端用户的提问,则返回适当的错误信息。
|
||
'''
|
||
if __name__ == '__main__':
|
||
index = DashScopeCloudIndex("my_first_index") # 读取百炼平台上已创建的知识库索引
|
||
query_engine = index.as_query_engine( # 构建检索引擎
|
||
similarity_top_k=similarity_top_k,
|
||
node_postprocessors=[ # 默认检索结果可能不满足需求,本例中通过加入node_postprocessors对检索结果进行后处理。
|
||
SimilarityPostprocessor(similarity_cutoff=similarity_cutoff), # 过滤不满足最低相似度阈值的检索结果。
|
||
DashScopeRerank(top_n=top_n, model="gte-rerank") # 对检索结果进行重排,返回语义上相关度最高的结果。
|
||
],
|
||
response_mode="tree_summarize"
|
||
)
|
||
while True:
|
||
user_prompt = input(init_chat)
|
||
if user_prompt in ['q','Q']:
|
||
break
|
||
resp = query_engine.query(prompt_template.format(user_prompt, resp_with_no_answer))
|
||
if len(resp.source_nodes) == 0:
|
||
output = resp_with_no_answer # 如果未找到相关上下文信息,则返回适当的报错信息。
|
||
else:
|
||
output = prettify_rag(resp)
|
||
print(output)
|