LlamaIndex:轻松构建索引查询本地文档的神器( 四 )


它仍然正确回答了问题 。那么,我们搜索到的内容,在这个过程里面是如何提交给的呢?我们就来看看下面的这段代码就知道了 。
from llama_index import Promptquery_str = "鲁迅先生去哪里学的医学?"DEFAULT_TEXT_QA_PROMPT_TMPL = ("Context information is below. \n""---------------------\n""{context_str}""\n---------------------\n""Given the context information and not prior knowledge, ""answer the question: {query_str}\n")QA_PROMPT = Prompt(DEFAULT_TEXT_QA_PROMPT_TMPL)query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)response = query_engine.query(query_str)print(response)
这段代码里,我们定义了一个的对象,并且为它设计了一个模版 。
1)、这个模版的开头,我们告诉 AI,我们为 AI 提供了一些上下文信息( ) 。
2)、模版里面支持两个变量,一个叫做,另一个叫做。的地方,在实际调用的时候,会被通过相似度找出来的内容填入 。而则是会被我们实际提的问题替换掉 。
3)、实际提问的时候,我们告诉 AI,只考虑上下文信息,而不要根据自己已经有的先验知识(prior )来回答问题 。
我们就是这样,把搜索找到的相关内容以及问题,组合到一起变成一段提示语,让 AI 能够按照我们的要求来回答问题 。那我们再问一次 AI,看看答案是不是没有变 。
输出结果:
鲁迅先生去仙台的医学专门学校学习医学 。
这一次 AI 还是正确地回答出了鲁迅先生是去仙台的医学专门学校学习的 。我们再试一试,问一些不相干的问题,会得到什么答案,比如我们问问西游记的作者是谁 。
QA_PROMPT_TMPL = ("下面的“我”指的是鲁迅先生 \n""---------------------\n""{context_str}""\n---------------------\n""根据这些信息,请回答问题: {query_str}\n""如果您不知道的话,请回答不知道\n")QA_PROMPT = Prompt(QA_PROMPT_TMPL)query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)response = query_engine.query("请问西游记的作者是谁?")print(response)
输出结果:
不知道
可以看到,AI 的确按照我们的指令回答不知道,而不是胡答一气 。
六、如何使用生成文档摘要总结
还有一个常见的使用 llama-index 的库的应用场景,就是生成文章摘要 。前面我们已经介绍过使用适当的提示语()来完成文本聚类 。然而,如果要总结一篇论文甚至一本书,由于由于的API接口最多只能支持4096个Token,显然是不够用的 。
为了解决这个问题 。我们可以通过对文本进行分段小结,并对这些小结再次进行总结来达到目的 。可以将文章或书籍构建成一个树状索引,其中每个节点代表其子节点内容的摘要 。最后,在整棵树的根节点处就可以得到整篇文章或整本书的总结 。
事实上,llama-index 本身就内置了这样的功能 。下面我们就来看看要实现这个功能,我们的代码应该怎么写 。
首先,我们先来安装一下 spaCy 这个库,并且下载一下对应的中文分词分句需要的模型 。
pip install spacypython -m spacy download zh_core_web_sm
下面的代码非常简单,我们选择了 llama-index 中最简单的索引结构。但是根据我们的需求,我们做了两个优化 。
首先,在索引中,我们指定了一个,这样在向发起请求时,会使用模型 。这个模型比较快速、价格也相对较低 。默认情况下,llama-index使用的模型是 text--003,其价格比 gpt-3.5-turbo 高出十倍 。当我们只进行几轮对话时,这种价格差异还不太明显 。但如果你要处理几十本书的内容,成本就会大幅增加 。因此,在这里我们设置了模型输出内容不超过1024个Token长度,以确保摘要不会太长,并避免合并无关内容 。