草稿

🔧 修改步骤

第一步:引入必要组件(已有)

你已经导入了:

from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub

第二步:构建 Agent(替换手动调用)

tools = [cast_yijing_hexagram] 之后,添加:

# ========== 构建 ReAct Agent ==========
prompt = hub.pull("hwchase17/react")  # 官方 ReAct 提示模板
agent = create_react_agent(llm, tools, prompt)

# 创建 AgentExecutor 
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,
    max_iterations=6,
    verbose=False  # 👈 关键:设为 False 保持输出干净
)

💡 如果你偶尔想看推理过程,可临时改为 verbose=True 调试。


第三步:替换主循环中的逻辑

删除原来的:

hexagram_result = cast_yijing_hexagram(user_input)
prompt = (...)
response = llm.invoke(prompt)

替换为:

# 让 Agent 自主决定是否调用工具并生成回答
response = agent_executor.invoke({
    "input": (
        f"你是一名精通《易经》的智者。用户的问题是:'{user_input}'。\n"
        "请用温暖、理性、白话文的方式解读:\n"
        "1. 先说明卦名和核心含义\n"
        "2. 结合用户问题给出具体建议\n"
        "3. 强调积极行动而非迷信\n"
        "4. 语气亲切如朋友交谈\n"
        "5. 避免使用专业术语,用日常语言表达"
    )
})

📝 修改后的关键段

# ========== 构建 ReAct Agent ==========
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,
    max_iterations=6,
    verbose=False  # 默认关闭 verbose,保持简洁
)


while True:
...
    try:
        user_input = input("❓ 你的问题: ").strip()
...

        # 交给 Agent 处理(它会自动调用 cast_yijing_hexagram)
        response = agent_executor.invoke({                  # 调用agent_executor
            "input": (
                f"你是一名精通《易经》的智者。用户的问题是:'{user_input}'。\n"
                "请用温暖、理性、白话文的方式解读:\n"
                "1. 先说明卦名和核心含义\n"
                "2. 结合用户问题给出具体建议\n"
                "3. 强调积极行动而非迷信\n"
                "4. 语气亲切如朋友交谈\n"
                "5. 避免使用专业术语,用日常语言表达"
            )
        })

...

完整的程序

# robust_agent_2_iching.py
import os
import random
from datetime import datetime
from dotenv import load_dotenv
from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
from langchain_openai import ChatOpenAI
import warnings

# ======== 关键优化:移除警告 + 精简输出 ========
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore", category=FutureWarning)

load_dotenv()

# 尝试导入 iching,失败则用 fallback
try:
    from iching import IChing
    ICHING_AVAILABLE = True
except ImportError:
    ICHING_AVAILABLE = False
    print("⚠️ 未安装 iching 库,使用简化版卦象数据")

# ========== Fallback: 简化版64卦数据(确保程序总能运行) ==========
if not ICHING_AVAILABLE:
    HEXAGRAMS = {
        1: ("乾为天", "元亨利贞。"),
        2: ("坤为地", "元亨,利牝马之贞。"),
        3: ("水雷屯", "元亨利贞,勿用有攸往,利建侯。"),
        4: ("山水蒙", "亨。匪我求童蒙,童蒙求我。"),
        5: ("水天需", "有孚,光亨,贞吉。利涉大川。"),
        6: ("天水讼", "有孚窒惕,中吉,终凶。"),
        7: ("地水师", "贞,丈人吉,无咎。"),
        8: ("水地比", "吉。原筮,元永贞,无咎。"),
    }

@tool
def cast_yijing_hexagram(question: str) -> str:
    """
    根据用户问题和当前时间起卦(梅花易数简化法)
    返回格式:卦名\n卦辞\n动爻(无前缀)
    """
    try:
        if not question.strip():
            return "起卦失败:问题不能为空。"
        now = datetime.now()
        seed = len(question.strip()) + now.year + now.month + now.day + now.hour + now.minute
        random.seed(seed)

        if ICHING_AVAILABLE:
            hex_num = random.randint(1, 64)
            changing_line = random.randint(1, 6)
            iching = IChing()
            name = iching.hexagrams[hex_num]["name"]
            guaci = iching.hexagrams[hex_num]["guaci"]
            return f"{name}\n{guaci}\n第 {changing_line} 爻"
        else:
            hex_num = random.randint(1, min(8, len(HEXAGRAMS)))
            name, guaci = HEXAGRAMS[hex_num]
            changing_line = random.randint(1, 6)
            return f"{name}\n{guaci}\n第 {changing_line} 爻"

    except Exception as e:
        return f"起卦失败: {str(e)}"

# ========== 初始化 LLM ==========
llm = ChatOpenAI(
    model="qwen-max",
    temperature=0.7,
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # ⚠️ 请确认此 URL 有效
    api_key=os.getenv("DASHSCOPE_API_KEY")
)

tools = [cast_yijing_hexagram]

# ========== 构建 ReAct Agent ==========
prompt = hub.pull("hwchase17/react")  # 官方 ReAct 提示模板
agent = create_react_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,
    max_iterations=6,
    verbose=False  # 👈 关键:保持输出简洁,不显示 Thought/Action/Observation
)

# ========== 主程序 ==========
print("🔮 AI 周易卜卦智能体(教学演示版)")
print("请输入你的困惑或问题,我将为你起卦并解读。\n")

while True:
    try:
        user_input = input("❓ 你的问题: ").strip()
        if not user_input:
            continue
        if user_input.lower() in {"quit", "exit", "q"}:
            print("🙏 天道酬勤。再见!")
            break

        # 交给 Agent 处理 —— 它会自动决定是否调用起卦工具
        response = agent_executor.invoke({
            "input": (
                f"你是一名精通《易经》的智者。用户的问题是:'{user_input}'。\n"
                "请用温暖、理性、白话文的方式解读这个卦象:\n"
                "1. 先说明卦名和核心含义\n"
                "2. 结合用户问题给出具体建议\n"
                "3. 强调积极行动而非迷信\n"
                "4. 语气亲切如朋友交谈\n"
                "5. 避免使用专业术语,用日常语言表达"
            )
        })

        print("\n" + "=" * 60)
        print("✨ 卦象解读:")
        print(response["output"])
        print()

    except KeyboardInterrupt:
        print("\n互动中 Ctrl + C 中断。")
        break
    except Exception as e:
        print(f"❌ 系统错误: {e}\n")
posted @ 2026-01-29 14:02  船山薪火  阅读(5)  评论(0)    收藏  举报
![image](https://img2024.cnblogs.com/blog/3174785/202601/3174785-20260125205854513-941832118.jpg)