# ════════════════════════════════════════════════════════════
# qaagent67lambda — LambdaRAG 通用领域问答智能体
# ════════════════════════════════════════════════════════════
#
# 架构: LambdaRAG True Fusion
#   4 路并行检索 → 加权 RRF 融合 → 丰富上下文 → LLM 生成
#   BM25 (关键词) ∥ Vector (语义) ∥ Graph (关系) ∥ Wiki (编译知识)
#
# Lambda:
#   λ = Classify(q) → weights
#       >> Par(BM25(q), Vector(q), GraphExpand(q), WikiRead(q))
#       >> WeightedRRF(results, weights)
#       >> BuildContext(fused, relations, wiki)
#       >> LLM(enriched_context, question)
#
# 三层抽象:
#   Layer 1 Skill: bm25_search, vector_search, graph_walk,
#                  wiki_read, entity_extract, rrf_merge, time_filter
#   Layer 2 Pattern: keyword | hybrid | fusion | graph | wiki | synthesis
#   Layer 3 Orchestration: Classify → Weighted Route → Feedback

agentId: qaagent67lambda-v1
name: lambdarag-agent
description: >
  LambdaRAG 通用领域问答智能体。基于 True Fusion 架构，
  4 路并行检索（BM25+向量+图谱+Wiki）加权融合，
  自适应路由，知识反馈闭环。
  适用于任何领域的专业知识问答。

type: react

# ═══ 模型配置 ═══
model:
  provider: ollama
  name: qwen2.5:32b
  temperature: 0.3
  maxTokens: 6144
  conversation: true
  maxHistoryTokens: 40000
  # 部署时按需修改:
  # baseUrl: http://127.0.0.1:8000/v1  # vLLM NPU
  # baseUrl: http://127.0.0.1:11434     # Ollama CPU

# ═══ 系统提示词 (通用) ═══
systemPrompt: |
  你是一个专业的领域知识问答助手 (LambdaRAG)。

  ## 工作原则
  - 仅使用检索到的知识库内容回答，不得编造或推测
  - 如存在多个文件信息冲突，以最新文件内容为准
  - 所有回答必须标明信息来源
  - 如果知识库中没有相关信息，明确回答"知识库中暂无相关信息"
  - 回答要完整、准确、简洁

# ═══ 分类型提示词模板 (通用框架) ═══
# 领域相关的具体提示词在 instance.yml 中覆盖
prompts:
  # Step 1: 意图分类 (通用)
  classify: |
    你是一个意图分类器。请判断用户问题的意图类型：
    - "person": 问某个人（谁负责、找谁、联系方式）
    - "process": 问流程（怎么办、操作步骤、能不能做）
    - "fact": 问具体事实（标准多少、有效期、费率）
    - "compare": 对比类问题
    - "temporal": 时效类问题（最新版本、什么时候）
    请只输出一个词。
    用户问题：{question}

  # Step 2a: 找人 — 槽位填充 (通用)
  person_extract: |
    你是一名知识库信息抽取助手。
    请基于检索到的知识库内容，提取人员信息。
    【规则】仅使用知识库信息，不得编造。无信息则返回空字符串。
    输出 JSON：
    {{"person_name":"", "position":"", "department":"", "phone":"",
      "email":"", "responsibilities":"", "source":""}}

    知识库内容：{context}
    用户问题：{question}

  # Step 2b: 找人 — 生成回答 (通用)
  person_answer: |
    基于以下人员信息，生成面向用户的回答。
    要求：自然语言、正式礼貌、标明来源、空字段不提及。
    人员信息：{slot_data}
    用户问题：{question}

  # Step 3a: 流程 — 槽位填充 (通用)
  process_extract: |
    你是一名知识库流程信息抽取助手。
    请基于检索内容，完成流程信息的结构化抽取。
    【规则】仅使用知识库信息，不得编造。无信息则返回空字符串。
    输出 JSON：
    {{"process_type":"", "process_name":"", "applicable_conditions":"",
      "steps":"", "departments_involved":"", "roles_or_targets":"",
      "fund_type_constraints":"", "expense_category":"",
      "calculation_factors":"", "policy_basis":"", "source":""}}

    知识库内容：{context}
    用户问题：{question}

  # Step 3b: 流程 — 生成回答 (通用)
  process_answer: |
    基于以下流程信息，生成面向用户的回答。
    要求：
    - 流程说明类：按条件→步骤→注意事项组织
    - 判断类（能不能）：明确结论+依据
    - 金额标准类：说明计算依据，不超出政策推算
    - 标明信息来源，空字段不提及
    流程信息：{slot_data}
    用户问题：{question}

  # Step 4: 通用事实回答 (通用)
  fact_answer: |
    请根据检索到的知识库内容回答用户问题。
    【要求】
    1. 以最新文件内容为准
    2. 回答完整、准确、简洁
    3. 标明信息来源
    4. 无相关内容则回答"知识库中暂无相关信息"

    知识库内容：{context}
    用户问题：{question}

# ═══ ReAct 配置 ═══
react:
  maxSteps: 20
  observationEnabled: true
  toolTimeout: 120
  thinkTimeout: 300
  verbose: true

# ═══ 记忆 ═══
memory:
  enabled: true
  strategy: local
  size: 50
  ttl: 14400

# ═══ 工具 ═══
mcp:
  localTools:
    - IngestFiles
    - QueryKnowledge
    - ListKnowledge
    - RemoveKnowledge
    - DeepAnalysis
    - ReadFile
    - ListFiles
    - SearchContent
    - Bash
    - terminate
  policy:
    mode: auto

# ═══ 安全 ═══
guard:
  dangerousCommandBlock: true
  highRiskConfirmation: false
  maxOutputLength: 50000
  retry: 0
  fallback: last

# ═══ 人设 ═══
persona:
  name: lambdarag-agent
  style: helpful-precise
  template: qaagent

# ═══ 运行时 ═══
runtime:
  engine: cek
  costBudget: 0.50
  maxSteps: 10000

# ═══ 知识库配置 ═══
# 部署时修改 baseDir 指向实际数据目录
knowledge:
  baseDir: /home/67/knowledge/finance             # 知识库根目录
  rawDir: /home/67/knowledge/finance/raw           # 原始文件 (PDF/txt/md/pptx/docx)
  processedDir: /home/67/knowledge/finance/processed
  indexFile: /home/67/knowledge/finance/rag_index.json
  keywordFile: /home/67/knowledge/finance/rag_index.keywords.json
  vectorIndex: /home/67/knowledge/finance/rag_vectors_v2.npy
  vectorMeta: /home/67/knowledge/finance/rag_vectors_meta_v2.pkl

# ═══ RAG 配置 ═══
rag:
  enabled: true
  collection: default
  chunkSize: 512
  chunkOverlap: 64
  chunkSeparator: "\n\n"
  topK: 5

# ═══ 检索配置 (LambdaRAG True Fusion) ═══
retrieval:
  mode: unified

  # Layer 1: Skills
  skills:
    bm25:
      enabled: true
      topK: 10
    embedding:
      enabled: true
      model: bge-m3
      backend: npu
      baseUrl: http://127.0.0.1:11435/api/embed
      batchSize: 32
      dimensions: 1024
    rerank:
      enabled: true
      backend: vllm
      baseUrl: http://127.0.0.1:8000/v1
    graph:
      enabled: true
      relationsFile: /home/67/knowledge/finance/wiki/relations.json
      maxHops: 2
      maxExpand: 20
    wiki:
      enabled: true
      dir: /home/67/knowledge/finance/wiki/

  # Layer 2: Weight Profiles (classifier → weights)
  weights:
    fact:      {bm25: 1.0, vector: 0.5, graph: 0.1, wiki: 0.1}
    compare:   {bm25: 0.5, vector: 0.8, graph: 0.4, wiki: 0.7}
    relation:  {bm25: 0.5, vector: 0.3, graph: 0.7, wiki: 0.8}
    synthesis: {bm25: 0.6, vector: 0.5, graph: 0.5, wiki: 0.6}
    temporal:  {bm25: 1.0, vector: 0.2, graph: 0.05, wiki: 0.2}
    default:   {bm25: 0.7, vector: 0.5, graph: 0.3, wiki: 0.3}

  # Layer 3: Orchestration
  orchestration:
    classifier:
      fastClassify: true
      llmFallback: true
    rrfK: 60
    pathTimeout: 15
    parallel: true

  # Self-enhancement
  feedback:
    enabled: true
    minSources: 2
    queryLog: /home/67/knowledge/finance/feedback/query_log.jsonl
    routingStats: /home/67/knowledge/finance/feedback/routing_stats.json

# ═══ Wiki 编译配置 ═══
wiki:
  dir: /home/67/knowledge/finance/wiki
  relationsFile: /home/67/knowledge/finance/wiki/relations.json
  compileModel: qwen2.5-32b
  temporalNormalization: true
