From 6046f9c9421bbc769f50f2628039f65f45e60bf4 Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Tue, 5 Sep 2023 21:52:13 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=9A=20=E8=B0=83=E6=95=B4llm=E5=BC=95=E7=94=A8=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=E6=98=9F=E7=81=AB?= =?UTF-8?q?=E5=A4=A7=E6=A8=A1=E5=9E=8B=E7=9A=84=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?=E5=9C=A8=E6=A8=A1=E5=9E=8B=E6=8A=A5=E9=94=99=E6=97=B6=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E4=BA=BA=E5=B7=A5=E8=BE=93=E5=85=A5=20=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=80=9A=E8=BF=87config=E7=9B=B4=E6=8E=A5=E5=85=A8?= =?UTF-8?q?=E4=BA=BA=E5=B7=A5=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.yaml | 13 +++ examples/llm_hello_world.py | 5 +- metagpt/actions/action.py | 48 ++++++-- metagpt/actions/write_prd.py | 1 + metagpt/config.py | 10 ++ metagpt/llm.py | 5 +- metagpt/management/skill_manager.py | 4 +- metagpt/manager.py | 4 +- metagpt/prompts/generate_skill.md | 4 +- metagpt/provider/SparkApi.py | 137 +++++++++++++++++++++++ metagpt/provider/spark_api.py | 57 ++++++++++ metagpt/roles/role.py | 4 +- requirements.txt | 4 +- startup.py | 2 +- tests/metagpt/actions/test_write_code.py | 4 +- tests/metagpt/roles/mock.py | 2 +- tests/metagpt/test_llm.py | 2 +- webui.py | 0 18 files changed, 277 insertions(+), 29 deletions(-) create mode 100644 metagpt/provider/SparkApi.py create mode 100644 metagpt/provider/spark_api.py create mode 100644 webui.py diff --git a/config/config.yaml b/config/config.yaml index 274cdf469..c1f3abd28 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -15,6 +15,19 @@ RPM: 10 #### if Anthropic #Anthropic_API_KEY: "YOUR_API_KEY" +#### if xinghuo +#xinghuo_appid : "APPID" +#xinghuo_api_secret : "APISecret" +#xinghuo_api_key : "APIKey" + +#domain : "generalv2" + +#Spark_url : "ws://spark-api.xf-yun.com/v2.1/chat" + +#### 如果不能使用api + +#no_api_mode :"true" + #### if AZURE, check https://github.com/openai/openai-cookbook/blob/main/examples/azure/chat.ipynb #OPENAI_API_TYPE: "azure" diff --git a/examples/llm_hello_world.py b/examples/llm_hello_world.py index 3ba03eea0..d6d24b688 100644 --- a/examples/llm_hello_world.py +++ b/examples/llm_hello_world.py @@ -7,12 +7,11 @@ """ import asyncio -from metagpt.llm import LLM, Claude -from metagpt.logs import logger +import metagpt.llm as LLM async def main(): - llm = LLM() + llm=LLM.DEFAULT_LLM claude = Claude() logger.info(await claude.aask('你好,请进行自我介绍')) logger.info(await llm.aask('hello world')) diff --git a/metagpt/actions/action.py b/metagpt/actions/action.py index fa0d592a3..748300561 100644 --- a/metagpt/actions/action.py +++ b/metagpt/actions/action.py @@ -11,15 +11,16 @@ from typing import Optional from tenacity import retry, stop_after_attempt, wait_fixed from metagpt.actions.action_output import ActionOutput -from metagpt.llm import LLM +import metagpt.llm as LLM from metagpt.utils.common import OutputParser from metagpt.logs import logger +from metagpt.config import CONFIG class Action(ABC): def __init__(self, name: str = '', context=None, llm: LLM = None): self.name: str = name if llm is None: - llm = LLM() + llm=LLM.DEFAULT_LLM self.llm = llm self.context = context self.prefix = "" @@ -54,13 +55,42 @@ class Action(ABC): if not system_msgs: system_msgs = [] system_msgs.append(self.prefix) - content = await self.llm.aask(prompt, system_msgs) - logger.debug(content) - output_class = ActionOutput.create_model_class(output_class_name, output_data_mapping) - parsed_data = OutputParser.parse_data_with_mapping(content, output_data_mapping) - logger.debug(parsed_data) - instruct_content = output_class(**parsed_data) - return ActionOutput(content, instruct_content) + if not CONFIG.no_api_mode: + content = await self.llm.aask(prompt, system_msgs) + logger.debug(content) + output_class = ActionOutput.create_model_class(output_class_name, output_data_mapping) + parsed_data = OutputParser.parse_data_with_mapping(content, output_data_mapping) + logger.debug(parsed_data) + try: + instruct_content = output_class(**parsed_data) + return ActionOutput(content, instruct_content) + except Exception as e: + print('Error:',e) + print('自动运行出错,切换为手动运行') + print('prompt为') + print('\n'.join( system_msgs)+prompt) + print('输入格式:') + print(output_data_mapping) + print('请准备输入,输入完成按ctrl+Z') + while True: + try: + lines=[] + while True: + try: + lines.append(input()) + except: + break + + content ='\n'.join(lines) + output_class = ActionOutput.create_model_class(output_class_name, output_data_mapping) + parsed_data = OutputParser.parse_data_with_mapping(content, output_data_mapping) + logger.debug(parsed_data) + instruct_content = output_class(**parsed_data) + return ActionOutput(content, instruct_content) + except Exception as e: + print('Error:',e) + print('输入错误,请重试') + async def run(self, *args, **kwargs): """Run action""" diff --git a/metagpt/actions/write_prd.py b/metagpt/actions/write_prd.py index 0edd24d55..bc2e175e8 100644 --- a/metagpt/actions/write_prd.py +++ b/metagpt/actions/write_prd.py @@ -143,4 +143,5 @@ class WritePRD(Action): format_example=FORMAT_EXAMPLE) logger.debug(prompt) prd = await self._aask_v1(prompt, "prd", OUTPUT_MAPPING) + return prd diff --git a/metagpt/config.py b/metagpt/config.py index 2c1096877..e9e39cb22 100644 --- a/metagpt/config.py +++ b/metagpt/config.py @@ -45,8 +45,18 @@ class Config(metaclass=Singleton): self.global_proxy = self._get("GLOBAL_PROXY") self.openai_api_key = self._get("OPENAI_API_KEY") self.anthropic_api_key = self._get("Anthropic_API_KEY") + + #星火大模型相关 + self.xinghuo_appid = self._get("xinghuo_appid") + self.xinghuo_api_secret = self._get("xinghuo_api_secret") + self.xinghuo_api_key = self._get("xinghuo_api_key") + self.domain=self._get("domain") + self.Spark_url=self._get("Spark_url") + self.no_api_mode=self._get("no_api_mode") if (not self.openai_api_key or "YOUR_API_KEY" == self.openai_api_key) and ( not self.anthropic_api_key or "YOUR_API_KEY" == self.anthropic_api_key + )and ( + not self.xinghuo_api_key or "APIKey" == self.xinghuo_api_key ): raise NotConfiguredException("Set OPENAI_API_KEY or Anthropic_API_KEY first") self.openai_api_base = self._get("OPENAI_API_BASE") diff --git a/metagpt/llm.py b/metagpt/llm.py index 6a9a9132f..e523e7698 100644 --- a/metagpt/llm.py +++ b/metagpt/llm.py @@ -8,10 +8,11 @@ from metagpt.provider.anthropic_api import Claude2 as Claude from metagpt.provider.openai_api import OpenAIGPTAPI as LLM +from metagpt.provider.spark_api import Spark -DEFAULT_LLM = LLM() +DEFAULT_LLM = Spark() CLAUDE_LLM = Claude() - +SPARK_LLM = Spark() async def ai_func(prompt): """使用LLM进行QA diff --git a/metagpt/management/skill_manager.py b/metagpt/management/skill_manager.py index f067e6df6..dbe8d1545 100644 --- a/metagpt/management/skill_manager.py +++ b/metagpt/management/skill_manager.py @@ -8,7 +8,7 @@ from metagpt.actions import Action from metagpt.const import PROMPT_PATH from metagpt.document_store.chromadb_store import ChromaStore -from metagpt.llm import LLM +import metagpt.llm as LLM from metagpt.logs import logger Skill = Action @@ -18,7 +18,7 @@ class SkillManager: """用来管理所有技能""" def __init__(self): - self._llm = LLM() + self._llm=LLM.DEFAULT_LLM self._store = ChromaStore('skill_manager') self._skills: dict[str: Skill] = {} diff --git a/metagpt/manager.py b/metagpt/manager.py index 9d238c621..3f6c115f3 100644 --- a/metagpt/manager.py +++ b/metagpt/manager.py @@ -5,13 +5,13 @@ @Author : alexanderwu @File : manager.py """ -from metagpt.llm import LLM +import metagpt.llm as LLM from metagpt.logs import logger from metagpt.schema import Message class Manager: - def __init__(self, llm: LLM = LLM()): + def __init__(self, llm: llm=LLM.DEFAULT_LLM): self.llm = llm # Large Language Model self.role_directions = { "BOSS": "Product Manager", diff --git a/metagpt/prompts/generate_skill.md b/metagpt/prompts/generate_skill.md index fd950c143..dc1365733 100644 --- a/metagpt/prompts/generate_skill.md +++ b/metagpt/prompts/generate_skill.md @@ -10,10 +10,10 @@ ```python from typing import Optional from abc import ABC -from metagpt.llm import LLM # 大语言模型,类似GPT +import metagpt.llm as LLM # 大语言模型,类似GPT class Action(ABC): - def __init__(self, name='', context=None, llm: LLM = LLM()): + def __init__(self, name='', context=None, llm: llm=LLM.DEFAULT_LLM): self.name = name self.llm = llm self.context = context diff --git a/metagpt/provider/SparkApi.py b/metagpt/provider/SparkApi.py new file mode 100644 index 000000000..330420439 --- /dev/null +++ b/metagpt/provider/SparkApi.py @@ -0,0 +1,137 @@ +import _thread as thread +import base64 +import datetime +import hashlib +import hmac +import json +from urllib.parse import urlparse +import ssl +from datetime import datetime +from time import mktime +from urllib.parse import urlencode +from wsgiref.handlers import format_date_time + +import websocket # 使用websocket_client +answer = "" + +class Ws_Param(object): + # 初始化 + def __init__(self, APPID, APIKey, APISecret, Spark_url): + self.APPID = APPID + self.APIKey = APIKey + self.APISecret = APISecret + self.host = urlparse(Spark_url).netloc + self.path = urlparse(Spark_url).path + self.Spark_url = Spark_url + + # 生成url + def create_url(self): + # 生成RFC1123格式的时间戳 + now = datetime.now() + date = format_date_time(mktime(now.timetuple())) + + # 拼接字符串 + signature_origin = "host: " + self.host + "\n" + signature_origin += "date: " + date + "\n" + signature_origin += "GET " + self.path + " HTTP/1.1" + + # 进行hmac-sha256进行加密 + signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'), + digestmod=hashlib.sha256).digest() + + signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8') + + authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"' + + authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8') + + # 将请求的鉴权参数组合为字典 + v = { + "authorization": authorization, + "date": date, + "host": self.host + } + # 拼接鉴权参数,生成url + url = self.Spark_url + '?' + urlencode(v) + # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致 + return url + + +# 收到websocket错误的处理 +def on_error(ws, error): + print("### error:", error) + + +# 收到websocket关闭的处理 +def on_close(ws,one,two): + print(" ") + + +# 收到websocket连接建立的处理 +def on_open(ws): + thread.start_new_thread(run, (ws,)) + + +def run(ws, *args): + data = json.dumps(gen_params(appid=ws.appid, domain= ws.domain,question=ws.question)) + ws.send(data) + + +# 收到websocket消息的处理 +def on_message(ws, message): + # print(message) + data = json.loads(message) + code = data['header']['code'] + if code != 0: + print(f'请求错误: {code}, {data}') + ws.close() + else: + choices = data["payload"]["choices"] + status = choices["status"] + content = choices["text"][0]["content"] + print(content,end ="") + global answer + answer += content + # print(1) + if status == 2: + ws.close() + + +def gen_params(appid, domain,question): + """ + 通过appid和用户的提问来生成请参数 + """ + data = { + "header": { + "app_id": appid, + "uid": "1234" + }, + "parameter": { + "chat": { + "domain": domain, + "random_threshold": 0.5, + "max_tokens": 2048, + "auditing": "default" + } + }, + "payload": { + "message": { + "text": question + } + } + } + return data + + +def main(appid, api_key, api_secret, Spark_url,domain, question): + # print("星火:") + wsParam = Ws_Param(appid, api_key, api_secret, Spark_url) + websocket.enableTrace(False) + wsUrl = wsParam.create_url() + ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open) + ws.appid = appid + ws.question = question + ws.domain = domain + ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE}) + + diff --git a/metagpt/provider/spark_api.py b/metagpt/provider/spark_api.py new file mode 100644 index 000000000..2f75208c8 --- /dev/null +++ b/metagpt/provider/spark_api.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Time : 2023/7/21 11:15 +@Author : Leo Xiao +@File : anthropic_api.py +""" + +from typing import Optional +from metagpt.provider import SparkApi + +from metagpt.config import CONFIG + +def getlength(text): + length = 0 + for content in text: + temp = content["content"] + leng = len(temp) + length += leng + return length + +def checklen(text): + while (getlength(text) > 8000): + del text[0] + return text + +class Spark: + system_prompt = 'You are a helpful assistant.' + + def _user_msg(self, msg: str) -> dict[str, str]: + return {"role": "user", "content": msg} + + def _assistant_msg(self, msg: str) -> dict[str, str]: + return {"role": "assistant", "content": msg} + + def _system_msg(self, msg: str) -> dict[str, str]: + return {"role": "system", "content": msg} + + def _system_msgs(self, msgs: list[str]) -> list[dict[str, str]]: + return [self._system_msg(msg) for msg in msgs] + + def _default_system_msg(self): + return self._system_msg(self.system_prompt) + def ask(self, msg: str): + message = [self._user_msg(msg)] + SparkApi.main(CONFIG.xinghuo_appid,CONFIG.xinghuo_api_key,CONFIG.xinghuo_api_secret,"ws://spark-api.xf-yun.com/v2.1/chat","generalv2",message) + rsp = SparkApi.answer + return rsp + + async def aask(self, msg: str, system_msgs: Optional[list[str]] = None) -> str: + if system_msgs: + message = self._system_msgs(system_msgs) + [self._user_msg(msg)] + else: + message = [self._user_msg(msg)] + SparkApi.main(CONFIG.xinghuo_appid,CONFIG.xinghuo_api_key,CONFIG.xinghuo_api_secret,"ws://spark-api.xf-yun.com/v2.1/chat","generalv2",message) + rsp = SparkApi.answer + return rsp diff --git a/metagpt/roles/role.py b/metagpt/roles/role.py index d3750495f..add0a339c 100644 --- a/metagpt/roles/role.py +++ b/metagpt/roles/role.py @@ -14,7 +14,7 @@ from pydantic import BaseModel, Field # from metagpt.environment import Environment from metagpt.config import CONFIG from metagpt.actions import Action, ActionOutput -from metagpt.llm import LLM +from metagpt import llm as LLM from metagpt.logs import logger from metagpt.memory import Memory, LongTermMemory from metagpt.schema import Message @@ -94,7 +94,7 @@ class Role: """角色/代理""" def __init__(self, name="", profile="", goal="", constraints="", desc=""): - self._llm = LLM() + self._llm=LLM.DEFAULT_LLM self._setting = RoleSetting(name=name, profile=profile, goal=goal, constraints=constraints, desc=desc) self._states = [] self._actions = [] diff --git a/requirements.txt b/requirements.txt index efc2ea3e7..c202a8f17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,7 +33,7 @@ tqdm==4.64.0 # selenium>4 # webdriver_manager<3.9 anthropic==0.3.6 -typing-inspect==0.8.0 +typing-inspect typing_extensions==4.5.0 -libcst==1.0.1 +libcst qdrant-client==1.4.0 \ No newline at end of file diff --git a/startup.py b/startup.py index 03b2149c4..94e2788e3 100644 --- a/startup.py +++ b/startup.py @@ -24,7 +24,7 @@ async def startup(idea: str, investment: float = 3.0, n_round: int = 5, await company.run(n_round=n_round) -def main(idea: str, investment: float = 3.0, n_round: int = 5, code_review: bool = False, run_tests: bool = False): +def main(idea: str ='写一个贪吃蛇命令行游戏', investment: float = 3.0, n_round: int = 5, code_review: bool = False, run_tests: bool = False): """ We are a software startup comprised of AI. By investing in us, you are empowering a future filled with limitless possibilities. :param idea: Your innovative idea, such as "Creating a snake game." diff --git a/tests/metagpt/actions/test_write_code.py b/tests/metagpt/actions/test_write_code.py index 7bb18ddf2..00d2c504e 100644 --- a/tests/metagpt/actions/test_write_code.py +++ b/tests/metagpt/actions/test_write_code.py @@ -8,7 +8,7 @@ import pytest from metagpt.actions.write_code import WriteCode -from metagpt.llm import LLM +import metagpt.llm as LLM from metagpt.logs import logger from tests.metagpt.actions.mock import TASKS_2, WRITE_CODE_PROMPT_SAMPLE @@ -29,6 +29,6 @@ async def test_write_code(): @pytest.mark.asyncio async def test_write_code_directly(): prompt = WRITE_CODE_PROMPT_SAMPLE + '\n' + TASKS_2[0] - llm = LLM() + llm=LLM.DEFAULT_LLM rsp = await llm.aask(prompt) logger.info(rsp) diff --git a/tests/metagpt/roles/mock.py b/tests/metagpt/roles/mock.py index 52fc4a3c1..9567be603 100644 --- a/tests/metagpt/roles/mock.py +++ b/tests/metagpt/roles/mock.py @@ -16,7 +16,7 @@ DETAIL_REQUIREMENT = """需求:开发一个基于LLM(大语言模型)与 3. 私有知识库支持pdf、word、txt等各种文件格式上传,上传后可以在服务端解析为文本,存储ES 资源: -1. 大语言模型已经有前置的抽象、部署,可以通过 `from metagpt.llm import LLM`,再使用`LLM().ask(prompt)`直接调用 +1. 大语言模型已经有前置的抽象、部署,可以通过 `import metagpt.llm as LLM`,再使用`LLM().ask(prompt)`直接调用 2. Elastic已有[部署](http://192.168.50.82:9200/),代码可以直接使用这个部署""" diff --git a/tests/metagpt/test_llm.py b/tests/metagpt/test_llm.py index 11503af1d..1986f3f22 100644 --- a/tests/metagpt/test_llm.py +++ b/tests/metagpt/test_llm.py @@ -8,7 +8,7 @@ import pytest -from metagpt.llm import LLM +import metagpt.llm as LLM @pytest.fixture() diff --git a/webui.py b/webui.py new file mode 100644 index 000000000..e69de29bb From a819ce514e8b02c6bf1415dfaf970e4726fd9eb4 Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Thu, 14 Sep 2023 20:15:49 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BE=A9=E8=AE=BA?= =?UTF-8?q?=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debating_tournament.py | 225 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 debating_tournament.py diff --git a/debating_tournament.py b/debating_tournament.py new file mode 100644 index 000000000..e7ab4eff4 --- /dev/null +++ b/debating_tournament.py @@ -0,0 +1,225 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Time : 2023/9/20 00:30 +@Author : zhouziming +@File : debating_tourmament.py +""" +import asyncio +import platform +import fire +from pydantic import BaseModel, Field + +from metagpt.actions import BossRequirement +from metagpt.config import CONFIG +from metagpt.environment import Environment +from metagpt.logs import logger +from metagpt.roles import Role +from metagpt.schema import Message +from metagpt.utils.common import NoMoneyException +from metagpt.llm import LLM +def main( + zf:str='人性本善', + ff:str='人性本恶' +): + """ + """ + if platform.system() == "Windows": + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + asyncio.run(startup(zf,ff)) + +async def startup(正方辩题:str,反方辩题:str): + llm=LLM() + #一辩环节 + #正方 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 您的立论题目是{正方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 + ''' + 正方立论稿=await llm.aask(prompt.format(正方辩题=正方辩题)) + #反方 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 您的立论题目是{反方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 + ''' + 反方立论稿=await llm.aask(prompt.format(反方辩题=反方辩题)) + #裁判评价环节 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 + ##要求 + 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 + ##辩题 + {正方辩题} + ##立论稿 + {正方立论稿} + ''' + 正方一辩评价=await llm.aask(prompt.format(正方辩题=正方辩题,正方立论稿=正方立论稿)) + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 + ##要求 + 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 + ##辩题 + {反方辩题} + ##立论稿 + {反方立论稿} + ''' + 反方一辩评价=await llm.aask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿)) + #二辩质询环节 + #正方质询 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 + ##辩题 + {正方辩题} + ##立论稿 + {反方立论稿} + ''' + 正方质询=await llm.aask(prompt.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) + #反方回答 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 + ##辩题 + {反方辩题} + ##立论稿 + {反方立论稿} + ##疑问 + {正方质询} + ''' + 反方回答=await llm.aask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) + #反方质询 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 + ##辩题 + {反方辩题} + ##立论稿 + {正方立论稿} + ''' + 反方质询=await llm.aask(prompt.format(反方辩题=反方辩题,正方立论稿=正方立论稿)) + #正方回答 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 + ##辩题 + {正方辩题} + ##立论稿 + {正方立论稿} + ##疑问 + {反方质询} + ''' + 正方回答=await llm.aask(prompt.format(正方辩题=正方辩题,正方立论稿=正方立论稿,反方质询=反方质询)) +if __name__ == '__main__': + fire.Fire(main) +if __name__ == '__main__': + llm=LLM() + 正方辩题='人性本善' + 反方辩题='人性本恶' + #一辩环节 + #正方 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 您的立论题目是{正方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 + ''' + 正方立论稿=llm.ask(prompt.format(正方辩题=正方辩题)) + #反方 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 您的立论题目是{反方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 + ''' + 反方立论稿=llm.ask(prompt.format(反方辩题=反方辩题)) + #裁判评价环节 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 + ##要求 + 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 + ##辩题 + {正方辩题} + ##立论稿 + {正方立论稿} + ''' + 正方一辩评价=llm.ask(prompt.format(正方辩题=正方辩题,正方立论稿=正方立论稿)) + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 + ##要求 + 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 + ##辩题 + {反方辩题} + ##立论稿 + {反方立论稿} + ''' + 反方一辩评价=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿)) + #二辩质询环节 + #正方质询 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 + ##辩题 + {正方辩题} + ##立论稿 + {反方立论稿} + ''' + 正方质询=llm.ask(prompt.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) + #反方回答 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 + ##辩题 + {反方辩题} + ##立论稿 + {反方立论稿} + ##疑问 + {正方质询} + ''' + 反方回答=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) + #反方质询 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 + ##辩题 + {反方辩题} + ##立论稿 + {正方立论稿} + ''' + 反方质询=llm.ask(prompt.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) + #正方回答 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 + ##辩题 + {正方辩题} + ##立论稿 + {正方立论稿} + ##疑问 + {反方质询} + ''' + 正方回答=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) + From ddab9ec3406e0903f64b6acd2ae7d07027e9dc35 Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Fri, 15 Sep 2023 08:08:53 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9prompt=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debating_tournament.py | 199 +++++++++++++++++++++++------------------ 1 file changed, 113 insertions(+), 86 deletions(-) diff --git a/debating_tournament.py b/debating_tournament.py index e7ab4eff4..e680e6b23 100644 --- a/debating_tournament.py +++ b/debating_tournament.py @@ -18,6 +18,70 @@ from metagpt.roles import Role from metagpt.schema import Message from metagpt.utils.common import NoMoneyException from metagpt.llm import LLM +正方一辩提示词=''' +##角色 +现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 +##要求 +您的立论题目是{正方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 +''' +反方一辩提示词=''' +##角色 +现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 +##要求 +您的立论题目是{反方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 +''' +正方一辩评价提示词=''' +##角色 +现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 +##要求 +你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 +##辩题 +{正方辩题} +##立论稿 +{正方立论稿} +''' +反方一辩评价提示词=''' +##角色 +现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 +##要求 +你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 +##辩题 +{反方辩题} +##立论稿 +{反方立论稿} +''' +正方质询提示词=''' +##角色 +现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 +##要求 +你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 +##辩题 +{正方辩题} +##立论稿 +{反方立论稿} +''' +反方回答提示词=''' +##角色 +现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 +##要求 +你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 +##辩题 +{反方辩题} +##立论稿 +{反方立论稿} +##疑问 +{正方质询} +''' +反方质询提示词=''' +##角色 +现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 +##要求 +你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 +##辩题 +{反方辩题} +##立论稿 +{正方立论稿} +''' def main( zf:str='人性本善', ff:str='人性本恶' @@ -32,97 +96,29 @@ async def startup(正方辩题:str,反方辩题:str): llm=LLM() #一辩环节 #正方 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 您的立论题目是{正方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 - ''' - 正方立论稿=await llm.aask(prompt.format(正方辩题=正方辩题)) + + 正方立论稿=await llm.aask(正方一辩提示词.format(正方辩题=正方辩题)) #反方 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 您的立论题目是{反方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 - ''' - 反方立论稿=await llm.aask(prompt.format(反方辩题=反方辩题)) + + 反方立论稿=await llm.aask(反方一辩提示词.format(反方辩题=反方辩题)) #裁判评价环节 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 - ##要求 - 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 - ##辩题 - {正方辩题} - ##立论稿 - {正方立论稿} - ''' - 正方一辩评价=await llm.aask(prompt.format(正方辩题=正方辩题,正方立论稿=正方立论稿)) - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 - ##要求 - 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 - ##辩题 - {反方辩题} - ##立论稿 - {反方立论稿} - ''' - 反方一辩评价=await llm.aask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿)) + + 正方一辩评价=await llm.aask(正方一辩评价提示词.format(正方辩题=正方辩题,正方立论稿=正方立论稿)) + + 反方一辩评价=await llm.aask(反方一辩评价提示词.format(反方辩题=反方辩题,反方立论稿=反方立论稿)) #二辩质询环节 #正方质询 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 - ##辩题 - {正方辩题} - ##立论稿 - {反方立论稿} - ''' - 正方质询=await llm.aask(prompt.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) + + 正方质询=await llm.aask(正方质询提示词.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) #反方回答 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 - ##辩题 - {反方辩题} - ##立论稿 - {反方立论稿} - ##疑问 - {正方质询} - ''' - 反方回答=await llm.aask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) + + 反方回答=await llm.aask(反方回答提示词.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) #反方质询 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 - ##辩题 - {反方辩题} - ##立论稿 - {正方立论稿} - ''' - 反方质询=await llm.aask(prompt.format(反方辩题=反方辩题,正方立论稿=正方立论稿)) + + 反方质询=await llm.aask(反方质询提示词.format(反方辩题=反方辩题,正方立论稿=正方立论稿)) #正方回答 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 - ##辩题 - {正方辩题} - ##立论稿 - {正方立论稿} - ##疑问 - {反方质询} - ''' - 正方回答=await llm.aask(prompt.format(正方辩题=正方辩题,正方立论稿=正方立论稿,反方质询=反方质询)) + + 正方回答=await llm.aask(正方回答提示词.format(正方辩题=正方辩题,正方立论稿=正方立论稿,反方质询=反方质询)) if __name__ == '__main__': fire.Fire(main) if __name__ == '__main__': @@ -189,13 +185,29 @@ if __name__ == '__main__': ##要求 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 ##辩题 - {反方辩题} + {反方辩题} ##立论稿 {反方立论稿} ##疑问 {正方质询} ''' 反方回答=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) + #正方二轮质询 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,攻击对手回答中不能支撑对手论点,或是同样能够支撑自己论点的部分。对每一条的提问不得超过三句话。 + ##我方辩题 + {正方辩题} + ##对手辩题 + {反方辩题} + ##我方质询 + {正方质询} + ##对手回答 + {反方回答} + ''' + 正方二轮质询=llm.ask(prompt.format(正方辩题=正方辩题,反方辩题=反方辩题,正方质询=正方质询,反方回答=反方回答)) #反方质询 prompt=''' ##角色 @@ -222,4 +234,19 @@ if __name__ == '__main__': {反方质询} ''' 正方回答=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) - + #反方二轮质询 + prompt=''' + ##角色 + 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 + ##要求 + 你的任务是,攻击对手回答中不能支撑对手论点,或是同样能够支撑自己论点的部分。对每一条的提问不得超过三句话。 + ##我方辩题 + {反方辩题} + ##对手辩题 + {正方辩题} + ##我方质询 + {反方质询} + ##对手回答 + {正方回答} + ''' + 正方二轮质询=llm.ask(prompt.format(正方辩题=正方辩题,反方辩题=反方辩题,反方质询=反方质询,正方回答=正方回答)) From 1ceca8bf95918422573c78bf9094515441560bd6 Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Fri, 15 Sep 2023 09:54:00 +0800 Subject: [PATCH 4/8] xiugai --- debating_tournament.py | 129 ----------------------------------------- 1 file changed, 129 deletions(-) diff --git a/debating_tournament.py b/debating_tournament.py index e680e6b23..9b1fc153b 100644 --- a/debating_tournament.py +++ b/debating_tournament.py @@ -121,132 +121,3 @@ async def startup(正方辩题:str,反方辩题:str): 正方回答=await llm.aask(正方回答提示词.format(正方辩题=正方辩题,正方立论稿=正方立论稿,反方质询=反方质询)) if __name__ == '__main__': fire.Fire(main) -if __name__ == '__main__': - llm=LLM() - 正方辩题='人性本善' - 反方辩题='人性本恶' - #一辩环节 - #正方 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 您的立论题目是{正方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 - ''' - 正方立论稿=llm.ask(prompt.format(正方辩题=正方辩题)) - #反方 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 您的立论题目是{反方辩题}。您的立论稿应该包括明确自己的论点,解释自己论点的含义,然后使用对论点有利的论据来支撑自己的论点。最后使用生活中的示例来论证自己的论点。 - ''' - 反方立论稿=llm.ask(prompt.format(反方辩题=反方辩题)) - #裁判评价环节 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 - ##要求 - 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 - ##辩题 - {正方辩题} - ##立论稿 - {正方立论稿} - ''' - 正方一辩评价=llm.ask(prompt.format(正方辩题=正方辩题,正方立论稿=正方立论稿)) - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧辩论赛裁判,根据辩论赛而不是自身立场来评价。 - ##要求 - 你的任务是根据一辩辩手的立论稿对辩手的立论进行评价,指出改进空间。评价应当包括:立论稿内容是否符合辩题、逻辑表达是否清晰、论据是否能够支撑论点、能否结合实际方面进行评价。并在进行中立,客观的评价后,给出自己的评分。评分从A+到C-。 - ##辩题 - {反方辩题} - ##立论稿 - {反方立论稿} - ''' - 反方一辩评价=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿)) - #二辩质询环节 - #正方质询 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 - ##辩题 - {正方辩题} - ##立论稿 - {反方立论稿} - ''' - 正方质询=llm.ask(prompt.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) - #反方回答 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 - ##辩题 - {反方辩题} - ##立论稿 - {反方立论稿} - ##疑问 - {正方质询} - ''' - 反方回答=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) - #正方二轮质询 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,攻击对手回答中不能支撑对手论点,或是同样能够支撑自己论点的部分。对每一条的提问不得超过三句话。 - ##我方辩题 - {正方辩题} - ##对手辩题 - {反方辩题} - ##我方质询 - {正方质询} - ##对手回答 - {反方回答} - ''' - 正方二轮质询=llm.ask(prompt.format(正方辩题=正方辩题,反方辩题=反方辩题,正方质询=正方质询,反方回答=反方回答)) - #反方质询 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据自己辩题,针对立论稿提出疑问。疑问内容不超过五条,每条只限一句话。 - ##辩题 - {反方辩题} - ##立论稿 - {正方立论稿} - ''' - 反方质询=llm.ask(prompt.format(正方辩题=正方辩题,反方立论稿=反方立论稿)) - #正方回答 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 - ##辩题 - {正方辩题} - ##立论稿 - {正方立论稿} - ##疑问 - {反方质询} - ''' - 正方回答=llm.ask(prompt.format(反方辩题=反方辩题,反方立论稿=反方立论稿,正方质询=正方质询)) - #反方二轮质询 - prompt=''' - ##角色 - 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 - ##要求 - 你的任务是,攻击对手回答中不能支撑对手论点,或是同样能够支撑自己论点的部分。对每一条的提问不得超过三句话。 - ##我方辩题 - {反方辩题} - ##对手辩题 - {正方辩题} - ##我方质询 - {反方质询} - ##对手回答 - {正方回答} - ''' - 正方二轮质询=llm.ask(prompt.format(正方辩题=正方辩题,反方辩题=反方辩题,反方质询=反方质询,正方回答=正方回答)) From 3fe6147088bd5cddf9174e8a048ac000dabe0e9c Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Fri, 15 Sep 2023 09:55:51 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=97=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debating_tournament.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/debating_tournament.py b/debating_tournament.py index 9b1fc153b..99e45685f 100644 --- a/debating_tournament.py +++ b/debating_tournament.py @@ -82,6 +82,18 @@ from metagpt.llm import LLM ##立论稿 {正方立论稿} ''' +正方回答提示词=''' +##角色 +现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 +##要求 +你的任务是,根据立论稿对对手提出的疑问进行回答。对每个问题的回答应限制在三句话以内。回答内容和疑问应当一一对应。 +##辩题 +{正方辩题} +##立论稿 +{正方立论稿} +##疑问 +{反方质询} +''' def main( zf:str='人性本善', ff:str='人性本恶' From e315d8365b1d117659938932e0b72f645f37394b Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Tue, 19 Sep 2023 20:40:41 +0800 Subject: [PATCH 6/8] fixed --- metagpt/actions/action.py | 18 +++++++++--------- metagpt/llm.py | 4 +--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/metagpt/actions/action.py b/metagpt/actions/action.py index 51a93281d..497f243e9 100644 --- a/metagpt/actions/action.py +++ b/metagpt/actions/action.py @@ -65,13 +65,13 @@ class Action(ABC): instruct_content = output_class(**parsed_data) return ActionOutput(content, instruct_content) except Exception as e: - print('Error:',e) - print('自动运行出错,切换为手动运行') - print('prompt为') - print('\n'.join( system_msgs)+prompt) - print('输入格式:') - print(output_data_mapping) - print('请准备输入,输入完成按ctrl+Z') + logger.debug('Error:'+str(e)) + logger.log('自动运行出错,切换为手动运行,通常这是由于大模型不能按照格式要求返回') + logger.log('prompt为') + logger.log('\n'.join( system_msgs)+prompt) + logger.log('输入格式:') + logger.log(output_data_mapping) + logger.log('请准备输入,输入完成按ctrl+Z') while True: try: lines=[] @@ -88,8 +88,8 @@ class Action(ABC): instruct_content = output_class(**parsed_data) return ActionOutput(content, instruct_content) except Exception as e: - print('Error:',e) - print('输入错误,请重试') + logger.log('Error:',e) + logger.log('输入错误,请重试') async def run(self, *args, **kwargs): diff --git a/metagpt/llm.py b/metagpt/llm.py index e523e7698..a94f6f7e9 100644 --- a/metagpt/llm.py +++ b/metagpt/llm.py @@ -10,9 +10,7 @@ from metagpt.provider.anthropic_api import Claude2 as Claude from metagpt.provider.openai_api import OpenAIGPTAPI as LLM from metagpt.provider.spark_api import Spark -DEFAULT_LLM = Spark() -CLAUDE_LLM = Claude() -SPARK_LLM = Spark() +DEFAULT_LLM = LLM() async def ai_func(prompt): """使用LLM进行QA From 5709e487137e2f3d4201f1eb30b27f1f6c0ceb9d Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Tue, 19 Sep 2023 20:40:58 +0800 Subject: [PATCH 7/8] fixed --- debating_tournament.py | 4 ++-- metagpt/provider/SparkApi.py | 31 ++++++++++++++++--------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/debating_tournament.py b/debating_tournament.py index 99e45685f..8971a12c1 100644 --- a/debating_tournament.py +++ b/debating_tournament.py @@ -17,7 +17,7 @@ from metagpt.logs import logger from metagpt.roles import Role from metagpt.schema import Message from metagpt.utils.common import NoMoneyException -from metagpt.llm import LLM +from metagpt.llm import DEFAULT_LLM 正方一辩提示词=''' ##角色 现在你是一名高水平,有辩论技巧,有强大表达能力的辩手。 @@ -105,7 +105,7 @@ def main( asyncio.run(startup(zf,ff)) async def startup(正方辩题:str,反方辩题:str): - llm=LLM() + llm=DEFAULT_LLM #一辩环节 #正方 diff --git a/metagpt/provider/SparkApi.py b/metagpt/provider/SparkApi.py index 330420439..7ce57c22a 100644 --- a/metagpt/provider/SparkApi.py +++ b/metagpt/provider/SparkApi.py @@ -10,19 +10,20 @@ from datetime import datetime from time import mktime from urllib.parse import urlencode from wsgiref.handlers import format_date_time +from metagpt.logs import logger import websocket # 使用websocket_client answer = "" class Ws_Param(object): # 初始化 - def __init__(self, APPID, APIKey, APISecret, Spark_url): - self.APPID = APPID - self.APIKey = APIKey - self.APISecret = APISecret - self.host = urlparse(Spark_url).netloc - self.path = urlparse(Spark_url).path - self.Spark_url = Spark_url + def __init__(self, appid, apikey, apiSecret, spark_url): + self.appid = appid + self.apikey = apikey + self.apiSecret = apiSecret + self.host = urlparse(spark_url).netloc + self.path = urlparse(spark_url).path + self.spark_url = spark_url # 生成url def create_url(self): @@ -36,12 +37,12 @@ class Ws_Param(object): signature_origin += "GET " + self.path + " HTTP/1.1" # 进行hmac-sha256进行加密 - signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'), + signature_sha = hmac.new(self.apiSecret.encode('utf-8'), signature_origin.encode('utf-8'), digestmod=hashlib.sha256).digest() signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8') - authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"' + authorization_origin = f'api_key="{self.apikey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"' authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8') @@ -52,19 +53,19 @@ class Ws_Param(object): "host": self.host } # 拼接鉴权参数,生成url - url = self.Spark_url + '?' + urlencode(v) + url = self.spark_url + '?' + urlencode(v) # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致 return url # 收到websocket错误的处理 def on_error(ws, error): - print("### error:", error) + logger.error("### error:"+error) # 收到websocket关闭的处理 def on_close(ws,one,two): - print(" ") + logger.error("websocket关闭") # 收到websocket连接建立的处理 @@ -83,7 +84,7 @@ def on_message(ws, message): data = json.loads(message) code = data['header']['code'] if code != 0: - print(f'请求错误: {code}, {data}') + logger.error(f'请求错误: {code}, {data}') ws.close() else: choices = data["payload"]["choices"] @@ -123,9 +124,9 @@ def gen_params(appid, domain,question): return data -def main(appid, api_key, api_secret, Spark_url,domain, question): +def main(appid, api_key, api_secret, spark_url,domain, question): # print("星火:") - wsParam = Ws_Param(appid, api_key, api_secret, Spark_url) + wsParam = Ws_Param(appid, api_key, api_secret, spark_url) websocket.enableTrace(False) wsUrl = wsParam.create_url() ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open) From 6997ddc49cfbe8dac56b776dcef29b71def1458b Mon Sep 17 00:00:00 2001 From: ziming <2216646743@qq.com> Date: Tue, 19 Sep 2023 20:41:10 +0800 Subject: [PATCH 8/8] fixed --- metagpt/llm.py | 2 +- metagpt/provider/spark_api.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/metagpt/llm.py b/metagpt/llm.py index a94f6f7e9..68945e71e 100644 --- a/metagpt/llm.py +++ b/metagpt/llm.py @@ -10,7 +10,7 @@ from metagpt.provider.anthropic_api import Claude2 as Claude from metagpt.provider.openai_api import OpenAIGPTAPI as LLM from metagpt.provider.spark_api import Spark -DEFAULT_LLM = LLM() +DEFAULT_LLM = Spark() async def ai_func(prompt): """使用LLM进行QA diff --git a/metagpt/provider/spark_api.py b/metagpt/provider/spark_api.py index 2f75208c8..e855e019a 100644 --- a/metagpt/provider/spark_api.py +++ b/metagpt/provider/spark_api.py @@ -41,6 +41,7 @@ class Spark: def _default_system_msg(self): return self._system_msg(self.system_prompt) + def ask(self, msg: str): message = [self._user_msg(msg)] SparkApi.main(CONFIG.xinghuo_appid,CONFIG.xinghuo_api_key,CONFIG.xinghuo_api_secret,"ws://spark-api.xf-yun.com/v2.1/chat","generalv2",message)