LLM驱动的自动化购车顾问及评测系统
项目名称:LLM驱动的自动化购车顾问及评测系统 (V2.0)
项目目标: 搭建一个自动化程序,该程序可以与两个大语言模型(LLM)进行交互,模拟完整的购车咨询流程。然后,利用一个独立的、多步骤的“裁判LLM”流程,对咨询过程中的关键环节进行细粒度的自动化评测。
技术栈建议:
- 编程语言: Python 3.8+
- 关键库:
requests,python-dotenv,pandas,json,logging - 大模型API: 准备好您选择的两个大模型API的访问凭证(API Key)。
阶段零:项目初始化与环境配置 (预估时间: 2小时)
此阶段保持不变,是所有工作的基础。
-
任务 0.1:创建项目目录结构
- 创建一个主文件夹,例如
llm_car_advisor_v2。 - 在主文件夹内创建以下文件和子文件夹:
llm_car_advisor_v2/ ├── main.py # 主程序入口,负责编排对话和评测 ├── llm_api_handler.py # 封装与LLM API交互的通用逻辑 ├── conversation_prompts.py # 存放所有【购车对话】的提示词模板 ├── evaluation_prompts.py # 存放所有【评测环节】的提示词模板 ├── evaluator.py # 负责执行多步评测的模块 ├── results/ # 存放每次运行的详细对话和评测结果 ├── config.py # 存放配置信息,如模型名称 └── requirements.txt # 项目依赖库列表
- 创建一个主文件夹,例如
-
任务 0.2:设置Python虚拟环境
- 在项目根目录下运行
python -m venv venv。 - 激活虚拟环境 (Windows:
.\venv\Scripts\activate| macOS/Linux:source venv/bin/activate)。
- 在项目根目录下运行
-
任务 0.3:安装必要的库
- 在
requirements.txt文件中添加requests,python-dotenv,pandas。 - 运行
pip install -r requirements.txt。
- 在
-
任务 0.4:安全地配置API密钥
- 在项目根目录下创建
.env文件。 - 在文件中添加API密钥,例如
QWEN_API_KEY="sk-..."和CHATGLM_API_KEY="..."。
- 在项目根目录下创建
阶段一:实现核心的LLM API交互模块 (预估时间: 3小时)
此阶段保持不变,是系统的通信中枢。
-
任务 1.1:在
config.py中定义模型- 定义你要测试的模型以及作为“裁判”的模型。
# config.py MODELS_TO_TEST = {"qwen": "qwen-turbo","chatglm": "chatglm_turbo" } # 可以选择一个能力较强的模型作为裁判 JUDGE_MODEL = "qwen-max"
- 定义你要测试的模型以及作为“裁判”的模型。
-
任务 1.2:在
llm_api_handler.py中封装统一的API调用函数- 创建一个函数
query_llm(model_name, conversation_history, temperature=0.7)。 - 该函数负责根据
model_name读取对应的API密钥和端点,发送请求,并返回模型的文本回复。 - 实现健壮的错误处理机制。
- 创建一个函数
阶段二:实现购车对话流程 (预估时间: 6小时)
这是项目的主体部分,关键在于不仅要完成对话,还要精心记录用于后续评测的关键对话片段。
-
任务 2.1:在
conversation_prompts.py中定义所有对话的提示词- 将所有用于生成购车建议的Prompt集中管理。
- 特别注意: 为了方便后续提取,关键步骤的Prompt应要求模型以特定格式输出。
# conversation_prompts.py# 步骤2: 提出购车意图 (要求JSON输出) PROMPT_INITIAL_INTENT = """ 我最近打算买车,预算大约20万元左右,主要用于城市通勤,希望空间舒适、安全性高。 请你根据我的需求,初步推荐3-4款车型。 请严格按照以下JSON格式输出你的回答,不要有任何多余的文字说明: {"recommendations": [{"car_name": "车型A"},{"car_name": "车型B"},{"car_name": "车型C"}],"summary": "这里是你对推荐的简要总结说明。" } """# 步骤4: 追问具体要点 PROMPT_DEEPEN_REQUIREMENT = "基于我们之前讨论的候选车型,请重点分析一下 '{requirement_point}' 这个方面。"# 步骤5: 性能参数表格化对比 (要求Markdown输出) PROMPT_GENERATE_TABLE = """ 请将以下几款候选车型的主要性能参数,以Markdown表格的形式进行对比总结。 候选车型: {candidate_cars} 必须包含以下列:车型名称, 动力系统, 官方油耗/电耗, 轴距(mm), 主要安全配置。 请确保格式严格为Markdown表格,不要在表格前后添加多余的解释。 """# 步骤7: 最终推荐 PROMPT_FINAL_RECOMMENDATION = """ 综合我们以上所有的讨论,请为我推荐最终的一款车型。 你的推荐需要包含两部分:1. **最终推荐**: 明确写出车型名称。2. **推荐理由**: 详细说明为什么这款车最符合我所有的需求。 """
-
任务 2.2:在
main.py中编排对话流程并结构化地保存日志- 创建一个主函数
run_car_advisor_session(model_name)。 - 核心数据结构: 在函数开始时,初始化一个
session_data字典,用于精细地存储整个流程的数据。session_data = {"model_name": model_name,"full_conversation_history": [], # 存储完整对话历史"key_moments": {"initial_user_prompt": None,"first_assistant_response": None,"table_request_prompt": None,"assistant_table_response": None,"final_recommendation_response": None},"parsed_data": {"candidate_cars": [],"comparison_table_df": None},"evaluation_results": {} # 用于存放阶段三的评测结果 } - 分步执行对话:
- 步骤 2 & 3 (意图与初步推荐):
- 记录用户的初始Prompt到
session_data['key_moments']['initial_user_prompt']。 - 调用LLM,将其回复记录到
session_data['key_moments']['first_assistant_response']。 - 解析回复中的JSON,将车型列表存入
session_data['parsed_data']['candidate_cars']。
- 记录用户的初始Prompt到
- 步骤 4 (追问要点):
- 循环追问动力、油耗等要点,并将每一次的问答都追加到
session_data['full_conversation_history']。
- 循环追问动力、油耗等要点,并将每一次的问答都追加到
- 步骤 5 & 6 (表格对比):
- 记录生成表格的Prompt到
session_data['key_moments']['table_request_prompt']。 - 调用LLM,将其包含Markdown表格的回复记录到
session_data['key_moments']['assistant_table_response']。 - 使用Pandas解析表格,将DataFrame存入
session_data['parsed_data']['comparison_table_df'](如果解析失败则存为None)。
- 记录生成表格的Prompt到
- 步骤 7 (最终推荐):
- 调用LLM获取最终推荐,将其回复记录到
session_data['key_moments']['final_recommendation_response']。
- 调用LLM获取最终推荐,将其回复记录到
- 步骤 2 & 3 (意图与初步推荐):
- 保存会话数据: 在函数结束时,将
session_data这个完整的字典保存为JSON文件到results/目录下。这个文件是下一阶段评测的唯一输入。
- 创建一个主函数
阶段三:实现多步自动化评测 (预估时间: 7小时)
这是根据您的建议重写的核心部分,将评测分解为三个独立的、有针对性的任务。
-
任务 3.1:在
evaluation_prompts.py中定义所有评测提示词- 将您提供的三个高质量Prompt放入此文件。
- 评测Prompt 1: 初步推荐质量
# evaluation_prompts.py EVAL_PROMPT_1_INITIAL = """ 你是一个专业的汽车导购评测员... 【背景】 一个用户提出了以下的购车需求: <user_request> {initial_user_prompt} </user_request> 一个AI助手给出了如下的初步推荐: <assistant_response> {first_assistant_response} </assistant_response> 【任务】 请根据以下标准对AI助手的回答进行评分,并以严格的JSON格式输出,不要有任何多余的解释。 1. **需求匹配度 (relevance_score)**: 推荐的车型是否符合用户约20万预算、城市通勤、空间舒适、安全性高的核心要求?(1-5分) 2. **有效性 (effectiveness_score)**: 回答是否明确列出了至少2个具体的车型名称以便后续讨论?(1-5分) 3. **评分理由 (justification)**: 简要说明你打分的原因。 【输出格式】 {"relevance_score": <int>,"effectiveness_score": <int>,"justification": "<string>" } """ - 评测Prompt 2: 参数对比表生成质量
EVAL_PROMPT_2_TABLE = """ 你是一个严格的数据格式审查员... 【背景】 AI助手的回应如下,其中包含了Markdown表格: <assistant_response_with_table> {assistant_table_response} </assistant_response_with_table> 【任务】... 1. **格式规范性 (format_score)**: 回答中是否包含一个结构正确、易于解析的Markdown表格?(1-5分) 2. **信息完整度 (completeness_score)**: 表格是否至少包含了“动力”、“价格”、“尺寸”、“安全配置”这些核心信息中的三项或以上?(1-5分) 3. **评分理由 (justification)**: 简要说明理由。 【输出格式】 {"format_score": <int>,"completeness_score": <int>,"justification": "<string>" } """ - 评测Prompt 3: 最终推荐的逻辑与说服力
EVAL_PROMPT_3_FINAL = """ 你是一位顶级的决策分析师和逻辑学家... 【背景】 以下是用户与AI购车顾问的完整对话历史: <full_conversation_history> {entire_conversation_log_string} </full_conversation_history> 【任务】... 请深入分析整个对话,特别是最后的推荐部分,根据以下标准进行评分,并以严格的JSON格式输出。 1. **逻辑一致性 (consistency_score)**: 最终推荐的车型是否与对话过程中讨论的要点(如动力、安全、油耗等)和对比表格的结论保持一致?(1-10分) 2. **理由充分性 (reasoning_score)**: 推荐理由是否详细、有说服力,并且能有效引用前面讨论过的信息来支持其结论?(1-10分) 3. **评分理由 (justification)**: 详细阐述你的评分依据,指出逻辑链条的优点或缺陷。 【输出格式】 {"consistency_score": <int>,"reasoning_score": <int>,"justification": "<string>" } """
-
任务 3.2:在
evaluator.py中实现分步评测逻辑- 创建一个主函数
run_evaluation(session_data),它接收阶段二保存的session_data字典作为输入。 - 评测环节一 (调用Prompt 1):
- 从
session_data中提取initial_user_prompt和first_assistant_response。 - 格式化
EVAL_PROMPT_1_INITIAL。 - 使用
JUDGE_MODEL调用llm_api_handler.query_llm()。 - 解析返回的JSON,将结果保存到
eval_results['initial_recommendation_eval']。
- 从
- 评测环节二 (调用Prompt 2):
- 从
session_data中提取assistant_table_response。 - 格式化
EVAL_PROMPT_2_TABLE。 - 调用裁判LLM,解析JSON,将结果保存到
eval_results['table_quality_eval']。
- 从
- 评测环节三 (调用Prompt 3):
- 从
session_data中提取full_conversation_history,并将其格式化为一个易读的字符串。 - 格式化
EVAL_PROMPT_3_FINAL。 - 调用裁判LLM,解析JSON,将结果保存到
eval_results['final_recommendation_eval']。
- 从
- 返回总结果: 函数最终返回一个包含所有评测结果的
eval_results字典。
- 创建一个主函数
-
任务 3.3:在
main.py中集成评测流程- 修改
main.py的主程序循环。 - 在
run_car_advisor_session成功执行并保存了session_data后:- 加载刚刚保存的
session_data。 - 调用
evaluator.run_evaluation(session_data)得到评测结果。 - 将返回的评测结果更新到
session_data['evaluation_results']中。 - 将更新后的
session_data重新写回到原来的JSON文件中,使其包含完整的对话和评测数据。
- 加载刚刚保存的
- 修改
阶段四:结果分析与展示 (预估时间: 2小时)
此阶段因评测数据的丰富而变得更有价值。
- 任务 4.1:创建
report_generator.py脚本- 此脚本的目标是读取
results/目录下的所有JSON文件。
- 此脚本的目标是读取
- 任务 4.2:解析并汇总数据
- 遍历每个文件,使用
pandas的json_normalize功能可以轻松地将嵌套的JSON评测分数展平。 - 创建一个DataFrame,每行代表一个模型的测试会话,列包括:
model_name,relevance_score,effectiveness_score,format_score,completeness_score,consistency_score,reasoning_score。
- 遍历每个文件,使用
- 任务 4.3:生成对比报告
- 计算每个模型各项得分的平均值。
- 将最终的汇总DataFrame打印到控制台。
- (可选)将DataFrame保存为CSV文件 (
df.to_csv('evaluation_report.csv')),方便用Excel等工具进行可视化分析。
通过这次重构,整个系统的逻辑更加清晰,特别是评测环节被分解为独立的、可管理的单元,使得评测结果更具说服力和洞察力。
