Toursim-Test / src /api /ollama_api.py
zhuhai111's picture
Upload 43 files
7cc8bc0 verified
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)