跳转至

关键词提取 (Keyword Extraction)

基于 LLM 的关键词提取模块,使用上游 LightRAG 的提示词模板,通过 with_structured_output(KeywordsSchema, method="function_calling") 实现类型安全的结构化提取。输出包含高层关键词(概念/主题)和低层关键词(实体/细节),用于指导知识图谱检索策略。

lightrag_langchain.keywords.extract_keywords async

extract_keywords(
    query: str, llm: ChatOpenAI, language: str = "Chinese"
) -> KeywordsSchema

通过 LLM 从用户查询中提取高层和低层关键词。

使用查询、示例和语言格式化上游 LightRAG prompt 模板,然后调用 llm.with_structured_output(KeywordsSchema, method="json_mode") 进行类型安全的提取。

Parameters

query: 用户的自然语言查询。 llm: 用于提取的 ChatOpenAI(或兼容)实例。必须支持 with_structured_output()。 language: 提取关键词的目标语言。默认为 "Chinese"(根据 D-13)。 通常取自 settings.query_params.keyword_language

Returns

KeywordsSchema 包含 LLM 提取的 high_level_keywordslow_level_keywords 的冻结模型。

Notes

  • 无缓存(D-12)——每次调用都会调用 LLM。
  • 无 json_repair 回退(D-14)——结构化输出失败会传播。
  • method="json_mode" 避免了 API 请求中的 tool_choice,后者与 DeepSeek v4-pro 的 thinking(reasoning)模式不兼容。关键词提取 prompt 已经指示模型输出 JSON。
Example
from lightrag_langchain.config import settings
from lightrag_langchain.llm import create_llm
from lightrag_langchain.keywords import extract_keywords

llm = create_llm(settings.llm)
result = await extract_keywords(
    query="启动东莞市防风Ⅰ级应急响应",
    llm=llm,
    language=settings.query_params.keyword_language,
)
print(result.high_level_keywords, result.low_level_keywords)
源代码位于: src/lightrag_langchain/keywords.py
async def extract_keywords(
    query: str,
    llm: ChatOpenAI,  # type: ignore[valid-type]  # duck-typed — any with_structured_output impl
    language: str = "Chinese",
) -> KeywordsSchema:
    """通过 LLM 从用户查询中提取高层和低层关键词。

    使用查询、示例和语言格式化上游 LightRAG prompt 模板,然后调用
    ``llm.with_structured_output(KeywordsSchema, method="json_mode")``
    进行类型安全的提取。

    Parameters
    ----------
    query:
        用户的自然语言查询。
    llm:
        用于提取的 ChatOpenAI(或兼容)实例。必须支持
        ``with_structured_output()``。
    language:
        提取关键词的目标语言。默认为 ``"Chinese"``(根据 D-13)。
        通常取自 ``settings.query_params.keyword_language``。

    Returns
    -------
    KeywordsSchema
        包含 LLM 提取的 ``high_level_keywords`` 和 ``low_level_keywords``
        的冻结模型。

    Notes
    -----
    - 无缓存(D-12)——每次调用都会调用 LLM。
    - 无 json_repair 回退(D-14)——结构化输出失败会传播。
    - ``method="json_mode"`` 避免了 API 请求中的 ``tool_choice``,后者与
      DeepSeek v4-pro 的 thinking(reasoning)模式不兼容。关键词提取 prompt
      已经指示模型输出 JSON。

    Example:
        ```python
        from lightrag_langchain.config import settings
        from lightrag_langchain.llm import create_llm
        from lightrag_langchain.keywords import extract_keywords

        llm = create_llm(settings.llm)
        result = await extract_keywords(
            query="启动东莞市防风Ⅰ级应急响应",
            llm=llm,
            language=settings.query_params.keyword_language,
        )
        print(result.high_level_keywords, result.low_level_keywords)
        ```
    """
    # Assemble examples into a single formatted string.
    examples_str = "\n".join(KEYWORDS_EXTRACTION_EXAMPLES)

    # Format the prompt template with all required placeholders.
    prompt = KEYWORDS_EXTRACTION_PROMPT.format(
        query=query,
        examples=examples_str,
        language=language,
    )

    # Create a structured LLM with json_mode to avoid tool_choice
    # incompatibility with DeepSeek v4-pro thinking (reasoning) mode.
    structured_llm = llm.with_structured_output(
        KeywordsSchema,
        method="json_mode",
    )

    # Extract keywords via async LLM call.
    result: KeywordsSchema = await structured_llm.ainvoke(prompt)

    return result

lightrag_langchain.keywords.KeywordsSchema

Bases: BaseModel

用于从用户查询中提取关键词的结构化输出。

冻结以防止提取后的意外修改。

Example
from lightrag_langchain.keywords import extract_keywords, KeywordsSchema

# result 是一个包含 high_level_keywords 和 low_level_keywords
# 字段的 KeywordsSchema 实例
result: KeywordsSchema = await extract_keywords(query, llm, language="Chinese")
print(result.high_level_keywords, result.low_level_keywords)
源代码位于: src/lightrag_langchain/keywords.py
class KeywordsSchema(BaseModel):
    """用于从用户查询中提取关键词的结构化输出。

    冻结以防止提取后的意外修改。

    Example:
        ```python
        from lightrag_langchain.keywords import extract_keywords, KeywordsSchema

        # result 是一个包含 high_level_keywords 和 low_level_keywords
        # 字段的 KeywordsSchema 实例
        result: KeywordsSchema = await extract_keywords(query, llm, language="Chinese")
        print(result.high_level_keywords, result.low_level_keywords)
        ```
    """

    model_config = ConfigDict(frozen=True)

    high_level_keywords: list[str]
    """总体概念或主题——用户的核心意图、主题领域或应急响应级别类型。"""

    low_level_keywords: list[str]
    """具体实体或细节——机构(包含城市名称)、专有名词、专业术语、
    基础设施、灾害事件、地理特征。"""

high_level_keywords instance-attribute

high_level_keywords: list[str]

总体概念或主题——用户的核心意图、主题领域或应急响应级别类型。

low_level_keywords instance-attribute

low_level_keywords: list[str]

具体实体或细节——机构(包含城市名称)、专有名词、专业术语、 基础设施、灾害事件、地理特征。