File size: 3,118 Bytes
7cc8bc0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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)