草稿
🔧 修改步骤
第一步:引入必要组件(已有)
你已经导入了:
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")
浙公网安备 33010602011771号