from typing import List, Dict from .llm_api import LLMInterface import requests import json class OllamaInterface(LLMInterface): def __init__(self, model_name: str = "qwen2.5:32b_ctx32k", base_url: str = "http://localhost:11434"): self.model_name = model_name self.base_url = base_url def generate(self, prompt: str) -> str: """使用 Ollama 生成响应""" try: response = requests.post( f"{self.base_url}/api/generate", json={ "model": self.model_name, "prompt": prompt, "stream": False, "options": { "temperature": 0.7, "top_p": 0.9, "top_k": 40, } } ) response.raise_for_status() return response.json()['response'] except Exception as e: print(f"Ollama 生成错误: {e}") return "" def _build_system_prompt(self, role: str) -> str: """构建系统提示词""" roles = { "summarizer": "你是一个专业的旅游内容分析师,擅长提取和总结旅游相关的关键信息。", "planner": "你是一个专业的旅行规划师,擅长制定详细的旅行计划。" } return roles.get(role, "你是一个专业的AI助手。") def summarize_document(self, content: str, title: str, url: str) -> str: """使用 Qwen 2.5 总结文档""" system_prompt = self._build_system_prompt("summarizer") prompt = f"""{system_prompt} 请分析以下旅游网页内容,生成一个信息丰富的总结段落。 网页标题:{title} 网页链接:{url} 网页内容: {content[:4000]} 要求: 1. 总结长度控制在300-500字 2. 保留最重要的旅游信息(景点、建议、提示等) 3. 使用客观的语气 4. 信息准确且实用 5. 去除营销和广告内容 6. 保持逻辑连贯性 请直接返回总结内容,不需要其他说明。""" return self.generate(prompt) def generate_travel_plan(self, query: str, context: List[Dict]) -> str: """使用 Qwen 2.5 生成旅行计划""" system_prompt = self._build_system_prompt("planner") context_text = "\n\n".join([ f"来源 {i+1}:\n{doc['passage']}" for i, doc in enumerate(context) ]) prompt = f"""{system_prompt} 请根据以下信息,为用户制定一个详细的旅行计划。 用户需求:{query} 参考信息: {context_text} 请提供以下内容: 1. 行程概览 2. 每日详细行程安排 3. 交通建议 4. 住宿推荐 5. 美食推荐 6. 注意事项和小贴士 要求: 1. 计划要详细且实用 2. 时间安排要合理 3. 建议要具体 4. 考虑实际情况(如交通时间、景点开放时间等) 5. 可以根据上下文补充合理的细节 请直接返回旅行计划内容,不需要其他说明。""" return self.generate(prompt)