💻 源码
# 导入 LangChain 提示模板
from langchain_core.prompts import PromptTemplate
# 导入日志和配置
from base import logger, Config
# 导入 OpenAI
from openai import OpenAI


class StrategySelector:
    def __init__(self):
        # 初始化 OpenAI 客户端
        self.client = OpenAI(api_key=Config().DASHSCOPE_API_KEY,
                             base_url=Config().DASHSCOPE_BASE_URL)
        # 获取策略选择提示模板
        self.strategy_prompt_template = self._get_strategy_prompt()

    def call_dashscope(self, prompt):
        # 调用 DashScope API
        try:
            # 创建聊天完成请求
            completion = self.client.chat.completions.create(
                model=Config().LLM_MODEL,
                messages=[
                    {"role": "system", "content": "你是一个有用的助手。"},
                    {"role": "user", "content": prompt}
                ],
                temperature=0.1
            )
            # 返回完成结果
            return completion.choices[0].message.content if completion.choices else "直接检索"
        except Exception as e:
            # 记录 API 调用失败
            logger.error(f"DashScope API 调用失败: {e}")
            # 默认返回直接检索
            return "直接检索"

    def _get_strategy_prompt(self):
        #   定义私有方法,获取策略选择 Prompt 模板
        return PromptTemplate(
            template="""
            你是一个智能助手,负责分析用户查询 {query},并从以下四种检索增强策略中选择一个最适合的策略,直接返回策略名称,不需要解释过程。

            以下是几种检索增强策略及其适用场景:

            1.  **直接检索:**
                * 描述:对用户查询直接进行检索,不进行任何增强处理。
                * 适用场景:适用于查询意图明确,需要从知识库中检索**特定信息**的问题,例如:
                    * 示例:
                        * 查询:AI 学科学费是多少?
                        * 策略:直接检索
                    * 查询:JAVA的课程大纲是什么?
                        * 策略:直接检索
            2.  **假设问题检索(HyDE):**
                * 描述:使用 LLM 生成一个假设的答案,然后基于假设答案进行检索。
                * 适用场景:适用于查询较为抽象,直接检索效果不佳的问题,例如:
                    * 示例:
                        * 查询:人工智能在教育领域的应用有哪些?
                        * 策略:假设问题检索
            3.  **子查询检索:**
                * 描述:将复杂的用户查询拆分为多个简单的子查询,分别检索并合并结果。
                * 适用场景:适用于查询涉及多个实体或方面,需要分别检索不同信息的问题,例如:
                    * 示例:
                        * 查询:比较 Milvus 和 Zilliz Cloud 的优缺点。
                        * 策略:子查询检索
            4.  **回溯问题检索:**
                * 描述:将复杂的用户查询转化为更基础、更易于检索的问题,然后进行检索。
                * 适用场景:适用于查询较为复杂,需要简化后才能有效检索的问题,例如:
                    * 示例:
                        * 查询:我有一个包含 100 亿条记录的数据集,想把它存储到 Milvus 中进行查询。可以吗?
                        * 策略:回溯问题检索

            根据用户查询 {query},直接返回最适合的策略名称,例如 "直接检索"。不要输出任何分析过程或其他内容。
            """
            ,
            input_variables=["query"],
        )

    #   定义方法,选择检索策略
    def select_strategy(self, query):
        #   调用 LLM 获取检索策略
        strategy = self.call_dashscope(self.strategy_prompt_template.format(query=query)).strip()
        logger.info(f"为查询 '{query}' 选择的检索策略:{strategy}")
        return strategy

if __name__ == '__main__':
    ss = StrategySelector()
    ss.select_strategy('AI大模型应该怎么学习')