Skip to content

Keyword

查询关键字表索引。

BaseKeywordTableRetriever #

Bases: BaseRetriever

基础关键词表检索器。

参数在子类之间共享。

Parameters:

Name Type Description Default
keyword_extract_template Optional[BasePromptTemplate]

关键词提取提示 (参见:ref:Prompt-Templates)。

None
query_keyword_extract_template Optional[BasePromptTemplate]

查询关键词提取 提示 (参见:ref:Prompt-Templates)。

None
refine_template Optional[BasePromptTemplate]

优化提示 (参见:ref:Prompt-Templates)。

required
text_qa_template Optional[BasePromptTemplate]

问答提示 (参见:ref:Prompt-Templates)。

required
max_keywords_per_query int

从查询中提取的关键词的最大数量。

10
num_chunks_per_query int

查询的文本块的最大数量。

10
Source code in llama_index/core/indices/keyword_table/retrievers.py
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
class BaseKeywordTableRetriever(BaseRetriever):
    """基础关键词表检索器。

参数在子类之间共享。

Args:
    keyword_extract_template (Optional[BasePromptTemplate]): 关键词提取提示
        (参见:ref:`Prompt-Templates`)。
    query_keyword_extract_template (Optional[BasePromptTemplate]): 查询关键词提取
        提示 (参见:ref:`Prompt-Templates`)。
    refine_template (Optional[BasePromptTemplate]): 优化提示
        (参见:ref:`Prompt-Templates`)。
    text_qa_template (Optional[BasePromptTemplate]): 问答提示
        (参见:ref:`Prompt-Templates`)。
    max_keywords_per_query (int): 从查询中提取的关键词的最大数量。
    num_chunks_per_query (int): 查询的文本块的最大数量。"""

    def __init__(
        self,
        index: BaseKeywordTableIndex,
        keyword_extract_template: Optional[BasePromptTemplate] = None,
        query_keyword_extract_template: Optional[BasePromptTemplate] = None,
        max_keywords_per_query: int = 10,
        num_chunks_per_query: int = 10,
        callback_manager: Optional[CallbackManager] = None,
        object_map: Optional[dict] = None,
        verbose: bool = False,
        **kwargs: Any,
    ) -> None:
        """初始化参数。"""
        self._index = index
        self._index_struct = index.index_struct
        self._docstore = index.docstore

        self.max_keywords_per_query = max_keywords_per_query
        self.num_chunks_per_query = num_chunks_per_query
        self.keyword_extract_template = (
            keyword_extract_template or DEFAULT_KEYWORD_EXTRACT_TEMPLATE
        )
        self.query_keyword_extract_template = query_keyword_extract_template or DQKET
        super().__init__(
            callback_manager=callback_manager or Settings.callback_manager,
            object_map=object_map,
            verbose=verbose,
        )

    @abstractmethod
    def _get_keywords(self, query_str: str) -> List[str]:
        """提取关键词。"""

    def _retrieve(
        self,
        query_bundle: QueryBundle,
    ) -> List[NodeWithScore]:
        """获取响应的节点。"""
        logger.info(f"> Starting query: {query_bundle.query_str}")
        keywords = self._get_keywords(query_bundle.query_str)
        logger.info(f"query keywords: {keywords}")

        # go through text chunks in order of most matching keywords
        chunk_indices_count: Dict[str, int] = defaultdict(int)
        keywords = [k for k in keywords if k in self._index_struct.keywords]
        logger.info(f"> Extracted keywords: {keywords}")
        for k in keywords:
            for node_id in self._index_struct.table[k]:
                chunk_indices_count[node_id] += 1
        sorted_chunk_indices = sorted(
            chunk_indices_count.keys(),
            key=lambda x: chunk_indices_count[x],
            reverse=True,
        )
        sorted_chunk_indices = sorted_chunk_indices[: self.num_chunks_per_query]
        sorted_nodes = self._docstore.get_nodes(sorted_chunk_indices)

        if logging.getLogger(__name__).getEffectiveLevel() == logging.DEBUG:
            for chunk_idx, node in zip(sorted_chunk_indices, sorted_nodes):
                logger.debug(
                    f"> Querying with idx: {chunk_idx}: "
                    f"{truncate_text(node.get_content(), 50)}"
                )
        return [NodeWithScore(node=node) for node in sorted_nodes]

KeywordTableGPTRetriever #

Bases: BaseKeywordTableRetriever

关键词表索引 GPT 检索器。

使用 GPT 提取关键词。在使用 retriever_mode="default" 时设置。

有关参数,请参阅 BaseGPTKeywordTableQuery。

Source code in llama_index/core/indices/keyword_table/retrievers.py
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class KeywordTableGPTRetriever(BaseKeywordTableRetriever):
    """关键词表索引 GPT 检索器。

使用 GPT 提取关键词。在使用 `retriever_mode="default"` 时设置。

有关参数,请参阅 BaseGPTKeywordTableQuery。"""

    def __init__(
        self,
        index: BaseKeywordTableIndex,
        keyword_extract_template: Optional[BasePromptTemplate] = None,
        query_keyword_extract_template: Optional[BasePromptTemplate] = None,
        max_keywords_per_query: int = 10,
        num_chunks_per_query: int = 10,
        llm: Optional[LLM] = None,
        callback_manager: Optional[CallbackManager] = None,
        object_map: Optional[dict] = None,
        verbose: bool = False,
        **kwargs: Any,
    ) -> None:
        """初始化参数。"""
        self._llm = llm or Settings.llm

        super().__init__(
            index=index,
            keyword_extract_template=keyword_extract_template,
            query_keyword_extract_template=query_keyword_extract_template,
            max_keywords_per_query=max_keywords_per_query,
            num_chunks_per_query=num_chunks_per_query,
            callback_manager=callback_manager or Settings.callback_manager,
            object_map=object_map,
            verbose=verbose,
        )

    def _get_keywords(self, query_str: str) -> List[str]:
        """提取关键词。"""
        response = self._llm.predict(
            self.query_keyword_extract_template,
            max_keywords=self.max_keywords_per_query,
            question=query_str,
        )
        keywords = extract_keywords_given_response(response, start_token="KEYWORDS:")
        return list(keywords)

KeywordTableSimpleRetriever #

Bases: BaseKeywordTableRetriever

关键词表索引简单检索器。

使用基于简单正则表达式的关键词提取器提取关键词。 当retriever_mode="simple"时设置。

有关参数,请参阅BaseGPTKeywordTableQuery。

Source code in llama_index/core/indices/keyword_table/retrievers.py
158
159
160
161
162
163
164
165
166
167
168
169
170
class KeywordTableSimpleRetriever(BaseKeywordTableRetriever):
    """关键词表索引简单检索器。

    使用基于简单正则表达式的关键词提取器提取关键词。
    当`retriever_mode="simple"`时设置。

    有关参数,请参阅BaseGPTKeywordTableQuery。"""

    def _get_keywords(self, query_str: str) -> List[str]:
        """提取关键词。"""
        return list(
            simple_extract_keywords(query_str, max_keywords=self.max_keywords_per_query)
        )

KeywordTableRAKERetriever #

Bases: BaseKeywordTableRetriever

关键词表索引RAKE检索器。

使用RAKE关键词提取器提取关键词。 当retriever_mode="rake"时设置。

有关参数,请参阅BaseGPTKeywordTableQuery。

Source code in llama_index/core/indices/keyword_table/retrievers.py
173
174
175
176
177
178
179
180
181
182
183
184
185
class KeywordTableRAKERetriever(BaseKeywordTableRetriever):
    """关键词表索引RAKE检索器。

使用RAKE关键词提取器提取关键词。
当`retriever_mode="rake"`时设置。

有关参数,请参阅BaseGPTKeywordTableQuery。"""

    def _get_keywords(self, query_str: str) -> List[str]:
        """提取关键词。"""
        return list(
            rake_extract_keywords(query_str, max_keywords=self.max_keywords_per_query)
        )