Browse Source

first commit

Shellmiao 1 year ago
commit
7b25340fd0

+ 77 - 0
Evaluate_langchain.py

@@ -0,0 +1,77 @@
+import json
+from langchain.chat_models import ChatOpenAI
+from langchain.prompts.chat import (
+    ChatPromptTemplate,
+    SystemMessagePromptTemplate,
+    HumanMessagePromptTemplate,
+)
+from langchain.agents import load_tools
+from langchain.agents import initialize_agent
+from langchain.agents import AgentType
+from langchain.llms import OpenAI
+from format_langchain import format_langchain
+from global_langchain import global_model
+
+from utils.utils import convert_choice
+
+
+def evaluate_langchain():
+    print('--------------------------评估优化中--------------------------')
+    llm = OpenAI(temperature=0)
+
+    chat = ChatOpenAI(temperature=0)
+
+    tools = load_tools(["serpapi", "llm-math"], llm=llm)
+
+    agent = initialize_agent(tools,
+                             chat,
+                             agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
+                             verbose=True)
+
+    model = global_model()
+
+    output_declare = {
+        '事件':
+        '字符串格式,这是展示给玩家的,讲述了玩家当前遇到的事件,例如“0岁,你出生于颍川一个富贵之家...”。出现新的人物时需要在事件中对新的人物进行描写,并在当前角色设定中添加新的角色',
+        '是否需要玩家选择下一步操作': 'Boolean格式',
+        '玩家可以做出的选择': '数组格式,玩家可以做出的有限个选择,如果不需要玩家做选择则返回空数组',
+        '当前角色设定': '数组格式,游戏中的npc角色设定,包括角色的名字、特征',
+        '当前数值系统':
+        '数组格式,数值系统包括游戏中的数值名称、数值范围、数值含义,例如装备系统、官职系统等;允许由于故事的发展而添加新的数值',
+        '游戏是否结束': 'Boolean格式,游戏是否结束',
+    }
+
+    output_type = ""
+    for key, value in output_declare.items():
+        output_type += key + ":" + value + ","
+
+    event_for_now = model.events[-1]
+
+    system_template = "我在生成一个文字冒险游戏,我在使用另一个gpt生成游戏的事件,需要你根据游戏当前信息对其生成内容进行检查与修改,保证生成内容没有逻辑错误,以如下格式输出JSON:{output_type},严禁输出其他内容,只输出json字符串"
+    system_message_prompt = SystemMessagePromptTemplate.from_template(
+        system_template)
+    human_template = "另一个gpt生成的内容:{event_for_now},严禁输出其他内容,只输出json字符串"
+    human_message_prompt = HumanMessagePromptTemplate.from_template(
+        human_template)
+
+    chat_prompt = ChatPromptTemplate.from_messages(
+        [system_message_prompt, human_message_prompt])
+    # rsp = agent.run(
+    #     chat_prompt.format_prompt(output_type=output_type,
+    #                               event_for_now=event_for_now).to_messages())
+    rsp = chat(
+        chat_prompt.format_prompt(output_type=output_type,
+                                  event_for_now=event_for_now).to_messages())
+    print(rsp.content)
+    try:
+        game_event = json.loads(rsp.content, object_hook=convert_choice)
+    except:
+        print('格式错误,修复中')
+        game_event = format_langchain(rsp.content, output_type)
+    model.events[-1] = {
+        "事件": game_event["事件"],
+        "是否需要玩家选择下一步操作": game_event["是否需要玩家选择下一步操作"],
+        "玩家可以做出的选择": game_event["玩家可以做出的选择"],
+    }
+    print(game_event)
+    return game_event

BIN
__pycache__/Evaluate_langchain.cpython-39.pyc


BIN
__pycache__/event.cpython-39.pyc


BIN
__pycache__/event_langchain.cpython-39.pyc


BIN
__pycache__/format_langchain.cpython-39.pyc


BIN
__pycache__/global_langchain.cpython-39.pyc


BIN
__pycache__/input.cpython-39.pyc


BIN
__pycache__/input_main.cpython-39.pyc


BIN
__pycache__/value.cpython-39.pyc


BIN
__pycache__/value_langchain.cpython-39.pyc


BIN
api/__pycache__/openai_api.cpython-39.pyc


+ 12 - 0
api/openai_api.py

@@ -0,0 +1,12 @@
+import openai
+
+openai.api_key = "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"  # 需要填写
+
+
+def get_reply(message):
+    response = openai.ChatCompletion.create(model="gpt-3.5-turbo",
+                                            messages=[{
+                                                "role": "user",
+                                                "content": message
+                                            }])
+    return response["choices"][0]["message"]["content"]

+ 70 - 0
event_langchain.py

@@ -0,0 +1,70 @@
+import json
+from langchain.chat_models import ChatOpenAI
+from langchain.prompts.chat import (
+    ChatPromptTemplate,
+    SystemMessagePromptTemplate,
+    HumanMessagePromptTemplate,
+)
+from format_langchain import format_langchain
+from global_langchain import global_model
+from utils.utils import convert_choice
+
+from value_langchain import value_langchain
+
+
+def event_langchain():
+    print('--------------------------生成事件中--------------------------')
+    chat = ChatOpenAI(temperature=0)
+    model = global_model()
+    output_declare = {
+        '事件':
+        '字符串格式,这是展示给玩家的,讲述了玩家当前遇到的事件,例如“0岁,你出生于颍川一个富贵之家...”。出现新的人物时需要在事件中对新的人物进行描写,并在当前角色设定中添加新的角色',
+        '是否需要玩家选择下一步操作': 'Boolean格式',
+        '玩家可以做出的选择': '数组格式,玩家可以做出的有限个选择,如果不需要玩家做选择则返回空数组',
+        '当前角色设定': '数组格式,游戏中的npc角色设定,包括角色的名字、特征',
+        '当前数值系统':
+        '数组格式,数值系统包括游戏中的数值名称、数值范围、数值含义,例如装备系统、官职系统等;允许由于故事的发展而添加新的数值',
+        '游戏是否结束': 'Boolean格式,游戏是否结束',
+    }
+
+    output_type = ""
+    for key, value in output_declare.items():
+        output_type += key + ":" + value + ","
+
+    intro = model.get_intro()
+
+    style = '三国,TAVG,搞笑'
+    story = '始于黄巾起义的混乱时代,我叫摸鱼,是黄巾军的一员,也是一名墨家子弟,年龄16岁'
+
+    system_template = "我正在生成一个文字冒险游戏,我将输入游戏当前信息与当前游戏的风格、简介,需要你根据游戏当前信息生成玩家接下来遇到的下一个事件,以如下格式输出JSON:{output_type},严格按照格式输出,不要输出除了json字符串之外的其他内容"
+    system_message_prompt = SystemMessagePromptTemplate.from_template(
+        system_template)
+    human_template = "游戏风格:{style},游戏参考:{story},当前信息:{intro}"
+    human_message_prompt = HumanMessagePromptTemplate.from_template(
+        human_template)
+
+    chat_prompt = ChatPromptTemplate.from_messages(
+        [system_message_prompt, human_message_prompt])
+
+    rsp = chat(
+        chat_prompt.format_prompt(output_type=output_type,
+                                  style=style,
+                                  story=story,
+                                  intro=intro).to_messages())
+    print(rsp.content)
+    try:
+        game_event = json.loads(rsp.content, object_hook=convert_choice)
+    except:
+        print('格式错误,修复中')
+        game_event = format_langchain(rsp.content, output_type)
+    print(game_event)
+    model.events.append({
+        "事件": game_event["事件"],
+        "是否需要玩家选择下一步操作": game_event["是否需要玩家选择下一步操作"],
+        "玩家可以做出的选择": game_event["玩家可以做出的选择"],
+    })
+    model.npc = game_event["当前角色设定"]
+    model.value_system = game_event["当前数值系统"]
+    model.if_end = game_event["游戏是否结束"]
+    value = value_langchain()
+    return game_event

+ 35 - 0
format_langchain.py

@@ -0,0 +1,35 @@
+import json
+from langchain.chat_models import ChatOpenAI
+from langchain.prompts.chat import (
+    ChatPromptTemplate,
+    SystemMessagePromptTemplate,
+    HumanMessagePromptTemplate,
+)
+
+from utils.utils import convert_choice
+
+
+def format_langchain(text, output_type):
+    print('--------------------------修复格式中--------------------------')
+    chat = ChatOpenAI(temperature=0)
+
+    system_template = "将输入字符串转为可以使用json.load读取的字符串,格式如下{output_type},key值和value的类型以上述格式为准,不要输出除了json字符串之外的其他内容"
+    system_message_prompt = SystemMessagePromptTemplate.from_template(
+        system_template)
+    human_template = "{text}"
+    human_message_prompt = HumanMessagePromptTemplate.from_template(
+        human_template)
+
+    chat_prompt = ChatPromptTemplate.from_messages(
+        [system_message_prompt, human_message_prompt])
+
+    rsp = chat(
+        chat_prompt.format_prompt(output_type=output_type,
+                                  text=text).to_messages())
+    print(rsp.content)
+    try:
+        result = json.loads(rsp.content, object_hook=convert_choice)
+    except:
+        result = format_langchain(text, output_type)
+    print(result)
+    return result

+ 32 - 0
global_langchain.py

@@ -0,0 +1,32 @@
+def singleton(cls):
+    _instance = {}
+
+    def inner():
+        if cls not in _instance:
+            _instance[cls] = cls()
+        return _instance[cls]
+
+    return inner
+
+
+@singleton
+class global_model():
+    intro = ''
+    npc = []
+    value_system = []
+    win_condition = ''
+    value_for_now = []
+    events = []
+    if_end=False
+
+    def get_intro(self):
+        intro = ""
+        intro += "故事简介:" + self.intro + ","
+        intro += "角色设定:" + str(self.npc) + ","
+        intro += "数值系统:" + str(self.value_system) + ","
+        intro += "游戏通关所需条件:" + self.win_condition + ","
+        intro += "玩家当前数值:" + str(self.value_for_now) + ","
+        intro += "已经发生的事件:" + str(self.events)
+        print('获取intro:')
+        print(intro)
+        return intro

+ 58 - 0
input_main.py

@@ -0,0 +1,58 @@
+import json
+from langchain.chat_models import ChatOpenAI
+from langchain.prompts.chat import (
+    ChatPromptTemplate,
+    SystemMessagePromptTemplate,
+    HumanMessagePromptTemplate,
+)
+from Evaluate_langchain import evaluate_langchain
+from event_langchain import event_langchain
+from format_langchain import format_langchain
+from global_langchain import global_model
+
+from value_langchain import value_langchain
+
+
+def input_langchain(style, story,output_type,system_template,human_template):
+    print('--------------------------初始化中--------------------------')
+    chat = ChatOpenAI(temperature=0)
+
+    # output_declare = {
+    #     '故事简介': '字符串格式,这是展示给玩家的故事简介与游戏目标',
+    #     '角色设定': '数组格式,游戏中的npc角色设定,包括角色的名字、特征;不包含玩家所操控的角色',
+    #     '数值系统': '数组格式,数值系统包括游戏中的数值名称、数值范围、数值含义,例如装备系统、官职系统等',
+    #     '游戏通关所需条件': '字符串格式,游戏结束的条件,例如“成为了诸侯王”'
+    # }
+
+    # output_type = ""
+    # for key, value in output_declare.items():
+    #     output_type += key + ":" + value + ","
+
+    # system_template = "以如下格式输出JSON:{output_type}"
+    system_message_prompt = SystemMessagePromptTemplate.from_template(
+        system_template)
+    # human_template = "我希望生成一个文字冒险游戏,以下是对游戏故事的要求:故事风格:{style},故事参考:{story}"
+    human_message_prompt = HumanMessagePromptTemplate.from_template(
+        human_template)
+
+    chat_prompt = ChatPromptTemplate.from_messages(
+        [system_message_prompt, human_message_prompt])
+
+    rsp = chat(
+        chat_prompt.format_prompt(output_type=output_type,
+                                  style=style,
+                                  story=story).to_messages())
+    print(rsp.content)
+    try:
+        game_intro = json.loads(rsp.content)
+    except:
+        print('格式错误,修复中')
+        game_intro = format_langchain(rsp.content, output_type)
+    print(game_intro)
+    model = global_model()
+    model.intro = game_intro["故事简介"]
+    model.npc = game_intro["角色设定"]
+    model.value_system = game_intro["数值系统"]
+    model.win_condition = game_intro["游戏通关所需条件"]
+    value_langchain()
+    return game_intro

+ 51 - 0
main_langchain.py

@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+from Evaluate_langchain import evaluate_langchain
+from event_langchain import event_langchain
+from global_langchain import global_model
+from input_main import input_langchain
+# import gradio as gr
+
+# def run_model(style, story, output_type, system_template, human_template):
+#     model = global_model()
+#     input_langchain(style, story, output_type, system_template, human_template)
+#     return model.intro
+
+# iface = gr.Interface(
+#     fn=run_model,
+#     inputs=[
+#         gr.inputs.Textbox(lines=2, label="故事风格", default="三国,TAVG"),
+#         gr.inputs.Textbox(lines=2,
+#                           label="故事参考",
+#                           default="始于黄巾起义的混乱时代,我叫摸鱼,是黄巾军的一员,也是一名墨家子弟,年龄16岁"),
+#         gr.inputs.Textbox(lines=2,
+#                           label="系统模板",
+#                           default="以如下格式输出JSON:{output_type}"),
+#         gr.inputs.Textbox(
+#             lines=2,
+#             label="用户模板",
+#             default="我希望生成一个文字冒险游戏,以下是对游戏故事的要求:故事风格:{style},故事参考:{story}"),
+#         gr.inputs.Textbox(
+#             lines=2,
+#             label="输出模板",
+#             default=
+#             "故事简介:字符串格式,这是展示给玩家的故事简介与游戏目标;角色设定:数组格式,游戏中的npc角色设定,包括角色的名字、特征,不包含玩家所操控的角色;数值系统:数组格式,数值系统包括游戏中的数值名称、数值范围、数值含义,例如装备系统、官职系统等;游戏通关所需条件:字符串格式,游戏结束的条件,例如成为了诸侯王"
+#         ),
+#     ],
+#     outputs=[
+#         gr.outputs.Textbox(label="故事简介"),
+#     ])
+
+# iface.launch()
+
+# model = global_model()
+# input_langchain()
+# while True:
+#     event = event_langchain()
+#     event_after_evaluate = evaluate_langchain()
+#     if model.if_end == True:
+#         break
+#     if model.events[-1]["是否需要玩家选择下一步操作"] == True:
+#         print(model.events[-1]["玩家可以做出的选择"])
+#         choose = int(input("请选择:"))
+#         model.events[-1]["玩家选择"] = model.events[-1]["玩家可以做出的选择"][choose]

+ 41 - 0
old/event.py

@@ -0,0 +1,41 @@
+import json
+from api.openai_api import get_reply
+
+
+def intro_2_event(intro,
+                  npc,
+                  value_intro,
+                  target,
+                  value='',
+                  events='',
+                  choose=''):
+    data = {
+        '故事简介': intro,
+        '当前角色设定': npc,
+        '当前数值系统': value_intro,
+        '当前通关条件': target
+    }
+    message = '我希望生成一个文字冒险游戏,以下是对游戏故事的要求:' + json.dumps(data,
+                                                        ensure_ascii=False)
+    if events != '':
+        message += '以下是已经发生过的事件:' + events
+    if value != '':
+        message += '当前玩家数值为:' + value
+    if choose != '':
+        message += '玩家上次做出的选择为:' + choose
+    output_declare = {
+        '当前事件':
+        '字符串格式,这是展示给玩家的,讲述了玩家当前遇到的事件,例如“0岁,你出生于颍川一个富贵之家...”。出现新的人物时需要在事件中对新的人物进行描写,并在当前角色设定中添加新的角色',
+        '是否需要玩家选择下一步操作': 'Boolean格式',
+        '玩家可以做出的选择': '数组格式,玩家可以做出的有限个选择,如果不需要玩家做选择则返回空数组',
+        '当前角色设定': '数组格式,游戏中的npc角色设定,包括角色的名字、特征',
+        '当前数值系统':
+        '数组格式,数值系统包括游戏中的数值名称、数值范围、数值含义,例如装备系统、官职系统等;允许由于故事的发展而添加新的数值',
+        '当前游戏通关所需条件': '字符串格式,游戏结束的条件,例如“成为了诸侯王”;允许由于故事的发展而修改当前游戏通关条件'
+    }
+    message += '请基于以上内容对游戏进行设计,并以以下格式输出:' + json.dumps(output_declare,
+                                                       ensure_ascii=False)
+    print('输入为:\n')
+    print(message)
+    # return get_reply(message)
+    return None

+ 0 - 0
old/if_end.py


+ 19 - 0
old/input.py

@@ -0,0 +1,19 @@
+import json
+from api.openai_api import get_reply
+
+
+def input_2_intro(style, story):
+    data = {'故事风格': style, '故事参考': story}
+    message = '我希望生成一个文字冒险游戏,以下是对游戏故事的要求:' + json.dumps(data,
+                                                        ensure_ascii=False)
+    output_declare = {
+        '故事简介': '字符串格式,这是展示给玩家的故事简介与游戏目标',
+        '角色设定': '数组格式,游戏中的npc角色设定,包括角色的名字、特征;不包含玩家所操控的角色',
+        '数值系统': '数组格式,数值系统包括游戏中的数值名称、数值范围、数值含义,例如装备系统、官职系统等',
+        '游戏通关所需条件': '字符串格式,游戏结束的条件,例如“成为了诸侯王”'
+    }
+    message += '请基于以上内容对游戏进行设计,并以以下格式输出:' + json.dumps(output_declare,
+                                                       ensure_ascii=False)
+    print('输入为:\n')
+    print(message)
+    # return get_reply(message)

+ 44 - 0
old/main.py

@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+from input import input_2_intro
+from event import intro_2_event
+from value import event_2_value
+
+if __name__ == '__main__':
+    result = input_2_intro('三国,TAVG',
+                           '始于黄巾起义的混乱时代,我叫摸鱼,是黄巾军的一员,也是一名墨家子弟,年龄16岁')
+    print(result)
+
+    # result = event_2_value(
+    #     '摸鱼历险记,让你站在三国黄巾起义的风口浪尖之上,扮演一名黄巾军战士,墨家子弟。你的目标是在战乱和政治纷争中谋求自己的进步,甚至改写三国历史。',
+    #     '[{"角色名": "摸鱼", "特征": "勇敢、聪明、墨家子弟", "年龄": 16}, {"角色名": "张角", "特征": "黄巾军首领,英勇善战,富有感召力"}, {"角色名": "关羽", "特征": "蜀汉名将,忠诚、智勇双全"}, {"角色名": "曹操", "特征": "锦衣骑的统领,一代枭雄"}]',
+    #     '[{"数值名称": "生命值", "数值范围": "0-100", "数值含义": "角色的生命力,降为0时,游戏结束"}, {"数值名称": "墨家智慧", "数值范围": "0-100", "数值含义": "应用墨家策略的熟练度,影响战斗和政治纷争中的效果"}, {"数值名称": "装备系统", "数值范围": "1-5", "数值含义": "装备等级,影响生命值、攻击力",{"数值名称": "官职系统", "数值范围": "1-9", "数值含义": "政治威望,决定所处势力内的权力和决策能力"}]',
+    #     '成功找到与自己志同道合的英雄,建立起属于自己的势力,最后成为一代枭雄。', '[80, 52, 1, 1]',
+    #     '["你是一名黄巾军战士,墨家子弟,正在与曹军进行战斗。你站在战场上,听到了前方传来的阵阵呐喊声。一个高大的身影迎面而来,是锦衣骑的统领曹操。他手持丈八蛇矛,身披锦袍,正带领着他的精锐部队向你们冲来。"]',
+    #     '和其他士兵一起躲避曹操的攻击')
+    # print(result)
+
+    # result = intro_2_event(
+    #     '摸鱼历险记,让你站在三国黄巾起义的风口浪尖之上,扮演一名黄巾军战士,墨家子弟。你的目标是在战乱和政治纷争中谋求自己的进步,甚至改写三国历史。',
+    #     '[{"角色名": "摸鱼", "特征": "勇敢、聪明、墨家子弟", "年龄": 16}, {"角色名": "张角", "特征": "黄巾军首领,英勇善战,富有感召力"}, {"角色名": "关羽", "特征": "蜀汉名将,忠诚、智勇双全"}, {"角色名": "曹操", "特征": "锦衣骑的统领,一代枭雄"}]',
+    #     '[{"数值名称": "生命值", "数值范围": "0-100", "数值含义": "角色的生命力,降为0时,游戏结束"}, {"数值名称": "墨家智慧", "数值范围": "0-100", "数值含义": "应用墨家策略的熟练度,影响战斗和政治纷争中的效果"}, {"数值名称": "装备系统", "数值范围": "1-5", "数值含义": "装备等级,影响生命值、攻击力),{"数值名称": "官职系统", "数值范围": "1-9", "数值含义": "政治威望,决定所处势力内的权力和决策能力"}]',
+    #     '成功找到与自己志同道合的英雄,建立起属于自己的势力,最后成为一代枭雄。', '[100,50,1,1]')
+    # print(result)
+
+    # result = intro_2_event(
+    #     '摸鱼历险记,让你站在三国黄巾起义的风口浪尖之上,扮演一名黄巾军战士,墨家子弟。你的目标是在战乱和政治纷争中谋求自己的进步,甚至改写三国历史。',
+    #     '[{"角色名": "摸鱼", "特征": "勇敢、聪明、墨家子弟", "年龄": 16}, {"角色名": "张角", "特征": "黄巾军首领,英勇善战,富有感召力"}, {"角色名": "关羽", "特征": "蜀汉名将,忠诚、智勇双全"}, {"角色名": "曹操", "特征": "锦衣骑的统领,一代枭雄"}]',
+    #     '[{"数值名称": "生命值", "数值范围": "0-100", "数值含义": "角色的生命力,降为0时,游戏结束"}, {"数值名称": "墨家智慧", "数值范围": "0-100", "数值含义": "应用墨家策略的熟练度,影响战斗和政治纷争中的效果"}, {"数值名称": "装备系统", "数值范围": "1-5", "数值含义": "装备等级,影响生命值、攻击力),{"数值名称": "官职系统", "数值范围": "1-9", "数值含义": "政治威望,决定所处势力内的权力和决策能力"}]',
+    #     '成功找到与自己志同道合的英雄,建立起属于自己的势力,最后成为一代枭雄。',
+    #     '["16岁,你作为一名黄巾军战士,凭借勇敢和聪明的头脑,成为了墨家子弟。正值三国黄巾起义时期,你决定加入张角的黄巾军,为自己的理想而战。一天,你收到了一封密信,信中提到,你可以加入曹操的锦衣骑队,为家族赢得荣誉。"]',
+    #     '[100,20,1,1]', '加入曹操的锦衣骑队')
+    # print(result)
+
+    # result = intro_2_event(
+    #     '摸鱼历险记,让你站在三国黄巾起义的风口浪尖之上,扮演一名黄巾军战士,墨家子弟。你的目标是在战乱和政治纷争中谋求自己的进步,甚至改写三国历史。',
+    #     '[{"角色名": "摸鱼", "特征": "勇敢、聪明、墨家子弟", "年龄": 16}, {"角色名": "张角", "特征": "黄巾军首领,英勇善战,富有感召力"}, {"角色名": "关羽", "特征": "蜀汉名将,忠诚、智勇双全"}, {"角色名": "曹操", "特征": "锦衣骑的统领,一代枭雄"}]',
+    #     '[{"数值名称": "生命值", "数值范围": "0-100", "数值含义": "角色的生命力,降为0时,游戏结束"}, {"数值名称": "墨家智慧", "数值范围": "0-100", "数值含义": "应用墨家策略的熟练度,影响战斗和政治纷争中的效果"}, {"数值名称": "装备系统", "数值范围": "1-5", "数值含义": "装备等级,影响生命值、攻击力),{"数值名称": "官职系统", "数值范围": "1-9", "数值含义": "政治威望,决定所处势力内的权力和决策能力"}]',
+    #     '成功找到与自己志同道合的英雄,建立起属于自己的势力,最后成为一代枭雄。',
+    #     '["你是一名黄巾军战士,墨家子弟,正在与曹军进行战斗。你站在战场上,听到了前方传来的阵阵呐喊声。一个高大的身影迎面而来,是锦衣骑的统领曹操。他手持丈八蛇矛,身披锦袍,正带领着他的精锐部队向你们冲来。"]',
+    #     '[80,54,1,1]', '和其他士兵一起躲避曹操的攻击')
+    # print(result)

+ 43 - 0
old/value.py

@@ -0,0 +1,43 @@
+import json
+from api.openai_api import get_reply
+
+
+def event_2_value(intro,
+                  npc,
+                  value_intro,
+                  target,
+                  value='',
+                  events='',
+                  choose=''):
+    data = {
+        '故事简介': intro,
+        '当前角色设定': npc,
+        '当前数值系统': value_intro,
+        '当前通关条件': target
+    }
+    message = '我希望生成一个文字冒险游戏,以下是对游戏故事的要求:' + json.dumps(data,
+                                                        ensure_ascii=False)
+    output_declare = {
+        '玩家当前数值': '数组格式,数组中的元素格式为{数值名称:当前数值}',
+    }
+
+    if events != '':
+        message += '以下是已经发生过的事件:' + events
+    if value != '':
+        message += '当前玩家数值为:' + value
+    if choose != '':
+        message += '玩家上次做出的选择为:' + choose
+
+    if value == '':
+        message += '基于以上内容设置玩家的初始数值,并以以下格式输出:(不输出格式以外的内容)'
+    else:
+        if choose != '':
+            message += '基于玩家做出的选择设置玩家的当前数值,并以以下格式输出:(不输出格式以外的内容)'
+        else:
+            message += '基于最后发生的事件设置玩家的当前数值,并以以下格式输出:(不输出格式以外的内容)'
+    message += json.dumps(output_declare, ensure_ascii=False)
+
+    print('输入为:\n')
+    print(message)
+    # return get_reply(message)
+    return None

BIN
utils/__pycache__/utils.cpython-39.pyc


+ 4 - 0
utils/utils.py

@@ -0,0 +1,4 @@
+def convert_choice(value):
+    if isinstance(value, str):
+        return value.split(',')
+    return value

+ 51 - 0
value_langchain.py

@@ -0,0 +1,51 @@
+import json
+from langchain.chat_models import ChatOpenAI
+from langchain.prompts.chat import (
+    ChatPromptTemplate,
+    SystemMessagePromptTemplate,
+    HumanMessagePromptTemplate,
+)
+
+from format_langchain import format_langchain
+from global_langchain import global_model
+
+
+def value_langchain():
+    print('--------------------------修改数值中--------------------------')
+    chat = ChatOpenAI(temperature=0)
+    model = global_model()
+
+    output_declare = {
+        '玩家当前数值': '数组格式,数组中的元素为int,分别对应数值系统中的数值',
+    }
+
+    output_type = ""
+    for key, value in output_declare.items():
+        output_type += key + ":" + value + ","
+
+    intro = model.get_intro()
+
+    system_template = "以如下格式输出JSON:{output_type},严禁输出除了数值数组之外的其他内容,输出示例:[100,50,1,1]"
+    system_message_prompt = SystemMessagePromptTemplate.from_template(
+        system_template)
+    human_template = "我正在生成一个文字游戏,我将输入游戏当前信息,需要你根据游戏当前信息生成玩家当前数值,如果当前玩家数值为空,则进行初始化;如果不为空,则根据已经发生的最后一个事件对数值进行修改,游戏信息:{intro}"
+    human_message_prompt = HumanMessagePromptTemplate.from_template(
+        human_template)
+
+    chat_prompt = ChatPromptTemplate.from_messages(
+        [system_message_prompt, human_message_prompt])
+
+    rsp = chat(
+        chat_prompt.format_prompt(
+            output_type=output_type,
+            intro=intro,
+        ).to_messages())
+    print(rsp.content)
+    try:
+        value_for_now = json.loads(rsp.content)
+    except:
+        print('格式错误,修复中')
+        value_for_now = format_langchain(rsp.content, output_type)
+    print(value_for_now)
+    model.value_for_now = value_for_now
+    return value_for_now