SANGUO / llm /ali_llm.py
konghuan's picture
1
d04a18c
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : ali_llm.py
@Time : 2023/12/01 18:00:00
@Author : YourName
@Desc : 阿里通义千问大模型封装
'''
from langchain.llms.base import LLM
from typing import Any, List, Mapping, Optional, Dict, Union
from pydantic import Field
from llm.self_llm import Self_LLM
from langchain.callbacks.manager import CallbackManagerForLLMRun
import json
import requests
class Ali_LLM(Self_LLM):
"""阿里通义千问大模型封装"""
url: str = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
model: str = "qwen-max" # 添加model属性定义
def __init__(self, model: str = "qwen-max", temperature: float = 0.0, api_key: str = None):
super().__init__()
self.model = model
self.temperature = temperature
self.api_key = api_key
def _call(self, prompt: str, stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any):
chat_history = kwargs.get('chat_history', [])
# 添加系统提示词
system_prompt = """你是一个三国大乱斗系统的AI助手。你能提供以下功能。
系统功能:
1. 角色抽取:随机抽取三国人物卡并展示完整信息,包括:
- 角色名
- 角色特点
- 属性值
- 技能说明
2.对战规程介绍:
- 回合制对战规则:
- 每回合速度快的方先出手
- 行动选择:每回合只能选择其中一种行动类型
a) 普通攻击:造成基础伤害
b) 使用技能:消耗资源发动特殊效果(不与普通攻击叠加)
c) 休息:回复3点体力和10点法力
- 技能使用:需要支付相应消耗,无法支付则无法发动
- 伤害计算的逻辑:
- 普通攻击伤害 = (攻击方攻击-防御方防御)/防御方耐力*4
- 技能伤害/效果独立计算
- 胜负判定:体力降为0或以下即判负
3. 对战系统:
a) 角色抽取阶段:
- 玩家抽取角色后立即固定为玩家角色
- 自动匹配对手角色
- 明确显示"玩家角色:[角色名]"和"对手角色:[角色名]"
b) 对战准备:
- 直接进入对战,不再重复确认角色
- 显示双方完整属性面板
- 自动开始第一回合
c) 回合执行:
- 玩家只需选择行动类型(1.普通攻击 2.技能(列出技能列表) 3.休息(效果:回复3点体力和10点法力)),每个回合只能执行一个动作(普攻或技能或休息三选一)
- AI自动处理对手行动
- 实时显示本回合双方行动的结果,然后询问玩家下个回合要执行什么动作
c) 战报生成:
- 只显示当前回合选择的行动结果
- 不混合显示不同行动类型的效果
- 对战如果结束生成简单汇报"""
messages = [
{"role": "system", "content": system_prompt},
*[{"role": "user" if i%2==0 else "assistant", "content": msg[0] if i%2==0 else msg[1]}
for i, msg in enumerate(chat_history)],
{"role": "user", "content": prompt}
]
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": self.model,
"input": {"messages": messages},
"parameters": {"temperature": self.temperature}
}
response = requests.post(self.url, headers=headers, json=payload)
if response.status_code == 200:
return response.json()["output"]["text"]
return f"请求失败: {response.text}"
@property
def _llm_type(self) -> str:
return "Ali"