baseline_eval.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import sys
  2. import os
  3. import json
  4. import argparse
  5. from datetime import datetime
  6. # Ensure project root is in python path
  7. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  8. from sqlalchemy.orm import Session
  9. from app.db.session import SessionLocal
  10. from app.crud import create_forum, create_persona, create_message, get_user_by_username
  11. from app.schemas import ForumCreate, PersonaCreate, MessageCreate
  12. from app.agent.agent import run_simple_agent
  13. def create_baseline_forum(topic: str, owner_username: str = "admin"):
  14. """
  15. Generate a baseline single-LLM response and save it as a forum.
  16. """
  17. db = SessionLocal()
  18. try:
  19. user = get_user_by_username(db, owner_username)
  20. if not user:
  21. print(f"User {owner_username} not found.")
  22. return
  23. # 1. Ensure Baseline Persona exists
  24. baseline_persona_name = "Baseline Model"
  25. # Direct DB query for simplicity
  26. from app.models import Persona
  27. baseline_persona = db.query(Persona).filter(Persona.name == baseline_persona_name).first()
  28. if not baseline_persona:
  29. print("Creating Baseline Persona...")
  30. p_create = PersonaCreate(
  31. name=baseline_persona_name,
  32. title="AI Assistant",
  33. bio="A standard large language model providing direct, comprehensive answers.",
  34. theories=[],
  35. stance="Neutral, Objective, Comprehensive",
  36. system_prompt="You are a helpful AI assistant. Provide a comprehensive and detailed answer to the user's topic.",
  37. is_public=True
  38. )
  39. baseline_persona = create_persona(db, p_create, user.id)
  40. print(f"Using Baseline Persona ID: {baseline_persona.id}")
  41. # 2. Create Baseline Forum
  42. print(f"Creating Baseline Forum for topic: '{topic}'...")
  43. f_create = ForumCreate(
  44. topic=topic,
  45. moderator_id=baseline_persona.id, # Baseline acts as moderator too? Or no moderator.
  46. participant_ids=[baseline_persona.id],
  47. duration_minutes=10
  48. )
  49. # Assuming create_forum handles moderator_id. Actually moderator is usually separate.
  50. # Let's use the baseline persona as moderator for simplicity or a system moderator.
  51. # If moderator_id is required... let's check ForumCreate schema.
  52. # It seems moderator_id is required. Let's use the baseline persona.
  53. forum = create_forum(db, f_create, user.id)
  54. print(f"Created Forum ID: {forum.id}")
  55. # 3. Generate Baseline Response
  56. print("Generating Baseline Response...")
  57. prompt = f"""
  58. 你是一个知识渊博的专家。请针对以下议题,发表一篇深度、全面、逻辑严密的论述。
  59. 【议题】:{topic}
  60. 要求:
  61. 1. 观点明确,论证充分。
  62. 2. 结构清晰,包含引言、正文(多角度分析)和结语。
  63. 3. 字数在 800 字左右。
  64. 4. 保持客观、理性的学术风格。
  65. """
  66. content = run_simple_agent(
  67. "BaselineEvaluationAgent",
  68. "你是一个知识渊博、客观严谨的议题分析专家。",
  69. prompt,
  70. )
  71. if not content:
  72. print("Failed to generate response.")
  73. return
  74. print("Response generated.")
  75. # 4. Save Message
  76. msg_create = MessageCreate(
  77. forum_id=forum.id,
  78. persona_id=baseline_persona.id,
  79. moderator_id=baseline_persona.id, # Self-moderated
  80. speaker_name=baseline_persona.name,
  81. content=content,
  82. turn_count=1
  83. )
  84. create_message(db, msg_create)
  85. print("Message saved.")
  86. # Mark as completed
  87. from app.models import Forum
  88. db_forum = db.query(Forum).filter(Forum.id == forum.id).first()
  89. db_forum.status = "completed"
  90. db.commit()
  91. print(f"\nBaseline Forum Ready! ID: {forum.id}")
  92. return forum.id
  93. finally:
  94. db.close()
  95. if __name__ == "__main__":
  96. parser = argparse.ArgumentParser(description="Create a baseline forum with a single LLM response.")
  97. parser.add_argument("topic", type=str, help="The topic for the baseline.")
  98. parser.add_argument("--owner", type=str, default="admin", help="Username of the owner.")
  99. args = parser.parse_args()
  100. create_baseline_forum(args.topic, args.owner)