blueocean / app.py
zcq's picture
Update app.py
fbe3314
import gradio as gr
import os
import re
import pandas as pd
import json
from ast import literal_eval
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain import OpenAI, ConversationChain
llm=OpenAI(openai_api_key=os.environ.get("OPENAI_API_KEY"))
def genCompetitorList(market):
promptCompetitors = PromptTemplate(
input_variables=["market"],
template="You are a helpful Blueocean strategy advisor. Return top 3 {market}. Only response single-quote JSON array without reasoning.",
)
chain = LLMChain(llm=llm, prompt=promptCompetitors)
responseCompetitorsArray = literal_eval(chain.run(market))
print(responseCompetitorsArray)
return gr.CheckboxGroup.update(choices=responseCompetitorsArray, interactive=True)
def genFeatureList(market,competitorList):
promptFeatures = PromptTemplate(
input_variables=["competitors"],
template="return 3 benefits customers get or vendors provide, when customers use product and services of vendors {competitors}. Return only nouns, no adjective. Only response single-quote JSON array without reasoning.输出中文",
)
chain = LLMChain(llm=llm, prompt=promptFeatures)
responseFeaturesArray=literal_eval(chain.run(' '.join(competitorList)))
print(responseFeaturesArray)
return gr.CheckboxGroup.update(choices=responseFeaturesArray, interactive=True)
def genRatingsPlot(market,competitorList,featureList):
#responseRating='[{"competitor": "大理古城", "便利": 5, "体验": 4, "服务": 3}, {"competitor": "云龙", "便利": 2, "体验": 3, "服务": 4}, {"competitor": "双廊", "便利": 4, "体验": 5, "服务": 2}]'
promptRatings = PromptTemplate(
input_variables=["features","competitors"],
template="return scoring 1 to 5 customers rate features:{features} for vendors:{competitors}.Only response single-quote JSON array without reasoning, features sequence and vendors sequence should be exactly the same as input, String \"competitor\" is the key cannot be omitted. Example: \"[\"competitor\": \"vendor1\", \"feature1\": 5, \"feature2\": 4 ; \"competitor\": \"vendor2\", \"feature1\": 2, \"feature2\": 3]\". 文字输出中文,标点符号用英文",
)
chain = LLMChain(llm=llm, prompt=promptRatings)
responseRatings = chain.run({"features":' '.join(featureList),"competitors":' '.join(competitorList)})
print(responseRatings.replace("'","\""))
data = json.loads(responseRatings.replace("'","\""))
df = pd.DataFrame(data)
print(df)
return gr.LinePlot.update(
value=df,
x="competitor",
y=df.columns[1],
x_title="竞品",
y_title="特性评分",
y_lim=[1,5],
color_legend_position="right",
width=500,
height=300
)
with gr.Blocks() as demo:
market = gr.Textbox(label="细分市场:如大理附近小镇")
btn1 = gr.Button(value="获取竞品")
competitorList = gr.CheckboxGroup(label="竞品列表")
btn1.click(genCompetitorList, inputs=[market], outputs=[competitorList])
btn2 = gr.Button(value="获取特性")
featureList = gr.CheckboxGroup(label="特性列表")
btn2.click(genFeatureList, inputs=[market,competitorList], outputs=[featureList])
btn3 = gr.Button(value="生成战略布局图")
plot = gr.LinePlot(title="战略布局图")
btn3.click(genRatingsPlot,inputs=[market,competitorList,featureList],outputs=[plot])
demo.launch()