内容参考于:图灵AI大模型全栈

效果图:

代码

from llama_index.core import StorageContext, load_index_from_storage, get_response_synthesizer
from base_llm import llm, embed_model
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.response_synthesizers.type import ResponseMode

new_storage_context = StorageContext.from_defaults(persist_dir="test")
index = load_index_from_storage(new_storage_context, embed_model=embed_model)
# 创建检索器
retriever = index.as_retriever(
    # 让检索器返回similarity_top_k个文档,这里返回2个文档
    similarity_top_k=2,
)

# 配置响应合成器
response_synthesizer = get_response_synthesizer(
    # 设置响应合成器拼接的模式
    response_mode=ResponseMode.TREE_SUMMARIZE,
    # 流式响应
    streaming=True,
    # streaming=False,
    # 指定一个大模型,TREE_SUMMARIZE模式会做总结所以要指定一个大模型
    llm=llm
)

# 组装查询引擎
query_engine = RetrieverQueryEngine(
    # 指定查询引擎使用的检索器
    retriever=retriever,
    # 指定查询引擎使用的响应合成器
    response_synthesizer=response_synthesizer
)

# 提问
response = query_engine.query("萧炎的妹妹叫什么名字?")

# 输出内容
# response.response可以查看大模型通过文档回答的内容,注意get_response_synthesizer里的streaming的值要为False才会有response这个东西
# response.source_nodes可以查看召回chunk,也就是通过文档找到的文档
# response.source_nodes[0].score可以查看相似度
# response.source_nodes[0].node.text可以查看文档的文本内容
# response.source_nodes[0].node.metadata查看metadata信息
# 打印,print方法会调用__str__或__repr__方法获取打印的内容,这里也就是会调用response对象的__str__或__repr__,如果response对象没有__str__方法就调用__repr__
# __repr__方法再Python中是必有的
print(response)

# 它自动流式打印,如果想获取流式的回答可以参考print_response_stream里面实现的逻辑
response.print_response_stream()
# 下方是print_response_stream的源码,它的流式回答的内容是通过获取response里的 response_txt 或 response_gen 来得到的
# 通过下方代码的逻辑可以看出 response_txt 里的内容是完成的回答内容,response_gen里的内容是流式获取的内容
# 但 response_txt 的内容也会流式获取,所以代码中是通过response_gen或response_txt来实现流式打印
#===============================================
# def print_response_stream(self) -> None:
#     """Print the response stream."""
#     if self.response_txt is None and self.response_gen is not None:
#         response_txt = ""
#         for text in self.response_gen:
#             print(text, end="", flush=True)
#             response_txt += text
#         self.response_txt = response_txt
#     else:
#         print(self.response_txt)
#=================================================

常见的查询引擎

查询引擎 主要角色 关键能力 处理步骤(简化描述) 适用任务 重要性
RetrieverQueryEngine RAG 基础构件 根据检索到的文档内容生成答案 接收查询 → 检索相关文档块 → 将上下文交给大模型 → 生成最终回复 知识库问答、FAQ、PDF 问答 ⭐⭐⭐⭐⭐
RouterQueryEngine 查询调度器 智能分发查询到最合适的引擎 查询输入 → 路由器判断意图 → 根据查询引擎的功能描述选定一个合适查询引擎 → 由该引擎回答问题 多知识库、多系统场景 ⭐⭐⭐⭐⭐
NLSQLTableQueryEngine 数据库智能接口 将自然语言请求转成 SQL 查询 用自然语言提问 → 使用大模型自动生成 SQL → 执行查询 → 归纳结果并回复 BI 分析、报表、数据查询 ⭐⭐⭐⭐⭐
TransformQueryEngine 查询增强层 对原始查询进行改写与优化 查询输入 → 改写/增强查询 → 再执行检索 HyDE、跨语言检索 ⭐⭐⭐
RetryQueryEngine 容错机制 查询执行失败时自动尝试重试 查询执行 → 检测到失败 → 自动重试(多次)→ 输出应答 提升结果召回与稳定性 ⭐⭐⭐

 


img

更多推荐