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)
|