Spaces:
Running
Running
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) |