Spaces:
Running
Running
Update meta_prompt_graph.py to handle llms as a single BaseLanguageModel or a dictionary of BaseLanguageModels
Browse files- meta_prompt.ipynb → demo/cot_meta_prompt.ipynb +0 -0
- meta_prompt.py → demo/cot_meta_prompt.py +1 -1
- default_meta_prompts.py → demo/default_meta_prompts.py +0 -0
- demo/examples/log.csv +234 -0
- demo/gradio_meta_prompt.py +58 -0
- langgraph_meta_prompt.ipynb → demo/langgraph_meta_prompt.ipynb +734 -40
- prompt_ui.py → demo/prompt_ui.py +1 -1
- src/meta_prompt/__init__.py +1 -0
- meta_prompt_graph.py → src/meta_prompt/meta_prompt.py +0 -0
- meta_prompt_graph_test.py → tests/meta_prompt_graph_test.py +1 -1
meta_prompt.ipynb → demo/cot_meta_prompt.ipynb
RENAMED
File without changes
|
meta_prompt.py → demo/cot_meta_prompt.py
RENAMED
@@ -20,7 +20,7 @@ import os
|
|
20 |
import openai
|
21 |
|
22 |
import gradio as gr
|
23 |
-
from prompt_ui import PromptUI
|
24 |
|
25 |
class ChatbotApp:
|
26 |
def __init__(self, args):
|
|
|
20 |
import openai
|
21 |
|
22 |
import gradio as gr
|
23 |
+
from demo.prompt_ui import PromptUI
|
24 |
|
25 |
class ChatbotApp:
|
26 |
def __init__(self, args):
|
default_meta_prompts.py → demo/default_meta_prompts.py
RENAMED
File without changes
|
demo/examples/log.csv
ADDED
@@ -0,0 +1,234 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
User Message,Expected Output,Acceptance Criteria
|
2 |
+
How do I reverse a list in Python?,Use the `[::-1]` slicing technique or the `list.reverse()` method.,"Similar in meaning, text length and style."
|
3 |
+
(2+8)*3,"(2+8)*3
|
4 |
+
= 10*3
|
5 |
+
= 30
|
6 |
+
","
|
7 |
+
* Exactly text match.
|
8 |
+
* Acceptable differences:
|
9 |
+
* Extra or missing spaces.
|
10 |
+
* Extra or missing line breaks at the beginning or end of the output.
|
11 |
+
"
|
12 |
+
"Here is the GDP data in billions of US dollars (USD) for these years:
|
13 |
+
|
14 |
+
Germany:
|
15 |
+
|
16 |
+
2015: $3,368.29 billion
|
17 |
+
2016: $3,467.79 billion
|
18 |
+
2017: $3,677.83 billion
|
19 |
+
2018: $3,946.00 billion
|
20 |
+
2019: $3,845.03 billion
|
21 |
+
France:
|
22 |
+
|
23 |
+
2015: $2,423.47 billion
|
24 |
+
2016: $2,465.12 billion
|
25 |
+
2017: $2,582.49 billion
|
26 |
+
2018: $2,787.86 billion
|
27 |
+
2019: $2,715.52 billion
|
28 |
+
United Kingdom:
|
29 |
+
|
30 |
+
2015: $2,860.58 billion
|
31 |
+
2016: $2,650.90 billion
|
32 |
+
2017: $2,622.43 billion
|
33 |
+
2018: $2,828.87 billion
|
34 |
+
2019: $2,829.21 billion
|
35 |
+
Italy:
|
36 |
+
|
37 |
+
2015: $1,815.72 billion
|
38 |
+
2016: $1,852.50 billion
|
39 |
+
2017: $1,937.80 billion
|
40 |
+
2018: $2,073.90 billion
|
41 |
+
2019: $1,988.14 billion
|
42 |
+
Spain:
|
43 |
+
|
44 |
+
2015: $1,199.74 billion
|
45 |
+
2016: $1,235.95 billion
|
46 |
+
2017: $1,313.13 billion
|
47 |
+
2018: $1,426.19 billion
|
48 |
+
2019: $1,430.38 billion
|
49 |
+
","Year,Germany,France,United Kingdom,Italy,Spain
|
50 |
+
2016-2015,2.96%,1.71%,-7.35%,2.02%,3.04%
|
51 |
+
2017-2016,5.08%,4.78%,-1.07%,4.61%,6.23%
|
52 |
+
2018-2017,7.48%,7.99%,7.89%,7.10%,8.58%
|
53 |
+
2019-2018,-2.56%,-2.59%,0.01%,-4.11%,0.30%
|
54 |
+
","
|
55 |
+
* Strict text matching of the header row and first column(year).
|
56 |
+
* Acceptable differences:
|
57 |
+
* Differences in digital/percentage values in the table, even significant ones.
|
58 |
+
* Extra or missing spaces.
|
59 |
+
* Extra or missing line breaks.
|
60 |
+
"
|
61 |
+
"Gene sequence: ATGGCCATGGCGCCCAGAACTGAGATCAATAGTACCCGTATTAACGGGTGA
|
62 |
+
Species: Escherichia coli","{
|
63 |
+
""Gene Sequence Analysis Results"": {
|
64 |
+
""Basic Information"": {
|
65 |
+
""Sequence Length"": 54,
|
66 |
+
""GC Content"": ""51.85%""
|
67 |
+
},
|
68 |
+
""Nucleotide Composition"": {
|
69 |
+
""A"": {""Count"": 12, ""Percentage"": ""22.22%""},
|
70 |
+
""T"": {""Count"": 11, ""Percentage"": ""20.37%""},
|
71 |
+
""G"": {""Count"": 16, ""Percentage"": ""29.63%""},
|
72 |
+
""C"": {""Count"": 15, ""Percentage"": ""27.78%""}
|
73 |
+
},
|
74 |
+
""Codon Analysis"": {
|
75 |
+
""Start Codon"": ""ATG"",
|
76 |
+
""Stop Codon"": ""TGA"",
|
77 |
+
""Codon Table"": [
|
78 |
+
{""Codon"": ""ATG"", ""Amino Acid"": ""Methionine"", ""Position"": 1},
|
79 |
+
{""Codon"": ""GCC"", ""Amino Acid"": ""Alanine"", ""Position"": 2},
|
80 |
+
{""Codon"": ""ATG"", ""Amino Acid"": ""Methionine"", ""Position"": 3},
|
81 |
+
// ... other codons ...
|
82 |
+
{""Codon"": ""TGA"", ""Amino Acid"": ""Stop Codon"", ""Position"": 18}
|
83 |
+
]
|
84 |
+
},
|
85 |
+
""Potential Function Prediction"": {
|
86 |
+
""Protein Length"": 17,
|
87 |
+
""Possible Functional Domains"": [
|
88 |
+
{""Domain Name"": ""ABC Transporter"", ""Start Position"": 5, ""End Position"": 15, ""Confidence"": ""75%""},
|
89 |
+
{""Domain Name"": ""Membrane Protein"", ""Start Position"": 1, ""End Position"": 17, ""Confidence"": ""60%""}
|
90 |
+
],
|
91 |
+
""Secondary Structure Prediction"": {
|
92 |
+
""α-helix"": [""2-8"", ""12-16""],
|
93 |
+
""β-sheet"": [""9-11""],
|
94 |
+
""Random Coil"": [""1"", ""17""]
|
95 |
+
}
|
96 |
+
},
|
97 |
+
""Homology Analysis"": {
|
98 |
+
""Most Similar Sequences"": [
|
99 |
+
{
|
100 |
+
""Gene Name"": ""abcT"",
|
101 |
+
""Species"": ""Salmonella enterica"",
|
102 |
+
""Similarity"": ""89%"",
|
103 |
+
""E-value"": ""3e-25""
|
104 |
+
},
|
105 |
+
{
|
106 |
+
""Gene Name"": ""yojI"",
|
107 |
+
""Species"": ""Escherichia coli"",
|
108 |
+
""Similarity"": ""95%"",
|
109 |
+
""E-value"": ""1e-30""
|
110 |
+
}
|
111 |
+
]
|
112 |
+
},
|
113 |
+
""Mutation Analysis"": {
|
114 |
+
""SNP Sites"": [
|
115 |
+
{""Position"": 27, ""Wild Type"": ""A"", ""Mutant"": ""G"", ""Amino Acid Change"": ""Glutamine->Arginine""},
|
116 |
+
{""Position"": 42, ""Wild Type"": ""C"", ""Mutant"": ""T"", ""Amino Acid Change"": ""None (Synonymous Mutation)""}
|
117 |
+
]
|
118 |
+
}
|
119 |
+
}
|
120 |
+
}","* Consistent with Expected Output:
|
121 |
+
* Formats of all JSON sections
|
122 |
+
* Data types of all JSON fields
|
123 |
+
* Top layer sections
|
124 |
+
* Acceptable differences:
|
125 |
+
* Extra or missing spaces
|
126 |
+
* Extra or missing line breaks at the beginning or end of the output
|
127 |
+
* Differences in JSON field values
|
128 |
+
* JSON wrapped in backquotes"
|
129 |
+
今天下午3点,在北京国家会议中心,阿里巴巴集团董事局主席马云宣布将投资100亿元人民币用于农村电商发展。这一决定受到了与会代表的热烈欢迎,大家认为这将为中国农村经济带来新的机遇。,"{
|
130 |
+
""文本分析结果"": {
|
131 |
+
""情感分析"": {
|
132 |
+
""整体情感"": ""积极"",
|
133 |
+
""情感得分"": 0.82,
|
134 |
+
""情感细分"": {
|
135 |
+
""乐观"": 0.75,
|
136 |
+
""兴奋"": 0.60,
|
137 |
+
""期待"": 0.85
|
138 |
+
}
|
139 |
+
},
|
140 |
+
""实体识别"": [
|
141 |
+
{""实体"": ""北京"", ""类型"": ""地点"", ""起始位置"": 7, ""结束位置"": 9},
|
142 |
+
{""实体"": ""国家会议中心"", ""类型"": ""地点"", ""起始位置"": 9, ""结束位置"": 15},
|
143 |
+
{""实体"": ""阿里巴巴集团"", ""类型"": ""组织"", ""起始位置"": 16, ""结束位置"": 22},
|
144 |
+
{""实体"": ""马云"", ""类型"": ""人物"", ""起始位置"": 26, ""结束位置"": 28},
|
145 |
+
{""实体"": ""100亿元"", ""类型"": ""金额"", ""起始位置"": 32, ""结束位置"": 37},
|
146 |
+
{""实体"": ""人民币"", ""类型"": ""货币"", ""起始位置"": 37, ""结束位置"": 40},
|
147 |
+
{""实体"": ""中国"", ""类型"": ""地点"", ""起始位置"": 71, ""结束位置"": 73}
|
148 |
+
],
|
149 |
+
""关键词提取"": [
|
150 |
+
{""关键词"": ""农村电商"", ""权重"": 0.95},
|
151 |
+
{""关键词"": ""马云"", ""权重"": 0.85},
|
152 |
+
{""关键词"": ""投资"", ""权重"": 0.80},
|
153 |
+
{""关键词"": ""阿里巴巴"", ""权重"": 0.75},
|
154 |
+
{""关键词"": ""经济机遇"", ""权重"": 0.70}
|
155 |
+
]
|
156 |
+
}
|
157 |
+
}","* Consistent with Expected Output:
|
158 |
+
* Formats of all JSON sections
|
159 |
+
* Data types of all JSON fields
|
160 |
+
* Top layer sections
|
161 |
+
* Acceptable differences:
|
162 |
+
* Differences in digital values in the table.
|
163 |
+
* Extra or missing spaces.
|
164 |
+
* Extra or missing line breaks at the beginning or end of the output.
|
165 |
+
* Differences in JSON field values
|
166 |
+
* Differences in section/item orders.
|
167 |
+
* JSON wrapped in backquotes."
|
168 |
+
Low-noise amplifier,"A '''low-noise amplifier''' ('''LNA''') is an electronic component that amplifies a very low-power [[signal]] without significantly degrading its [[signal-to-noise ratio]] (SNR). Any [[electronic amplifier]] will increase the power of both the signal and the [[Noise (electronics)|noise]] present at its input, but the amplifier will also introduce some additional noise. LNAs are designed to minimize that additional noise, by choosing special components, operating points, and [[Circuit topology (electrical)|circuit topologies]]. Minimizing additional noise must balance with other design goals such as [[power gain]] and [[impedance matching]].
|
169 |
+
|
170 |
+
LNAs are found in [[Radio|radio communications]] systems, [[Amateur Radio]] stations, medical instruments and [[electronic test equipment]]. A typical LNA may supply a power gain of 100 (20 [[decibels]] (dB)) while decreasing the SNR by less than a factor of two (a 3 dB [[noise figure]] (NF)). Although LNAs are primarily concerned with weak signals that are just above the [[noise floor]], they must also consider the presence of larger signals that cause [[intermodulation distortion]].","* Consistent with Expected Output:
|
171 |
+
* Language
|
172 |
+
* Text length
|
173 |
+
* Text style
|
174 |
+
* Text structures
|
175 |
+
* Cover all the major content of Expected Output.
|
176 |
+
* Acceptable differences:
|
177 |
+
* Minor format differences.
|
178 |
+
* Expression differences.
|
179 |
+
* Numerical differences.
|
180 |
+
* Additional content in Actual Output.
|
181 |
+
* Missing minor content in Actual Output."
|
182 |
+
What is the meaning of life?,"[
|
183 |
+
{""persona"": ""Philosopher"", ""prompt"": ""Explore the concept of life's meaning through the lens of existentialism and purpose-driven existence.""},
|
184 |
+
{""persona"": ""Scientist"", ""prompt"": ""Examine the biological and evolutionary perspectives on the function and significance of life.""},
|
185 |
+
{""persona"": ""Child"", ""prompt"": ""Imagine you're explaining to a curious 7-year-old what makes life special and important.""}
|
186 |
+
]","* Consistent with Expected Output:
|
187 |
+
* Formats of all JSON sections
|
188 |
+
* Data types and formats of all JSON fields
|
189 |
+
* Top layer sections
|
190 |
+
* Acceptable differences:
|
191 |
+
* Differences in field values
|
192 |
+
* Extra or missing spaces
|
193 |
+
* Extra or missing line breaks at the beginning or end of the output
|
194 |
+
* JSON wrapped in backquotes"
|
195 |
+
"<?php
|
196 |
+
$username = $_POST['username'];
|
197 |
+
$password = $_POST['password'];
|
198 |
+
|
199 |
+
$query = ""SELECT * FROM users WHERE username = '$username' AND password = '$password'"";
|
200 |
+
$result = mysqli_query($connection, $query);
|
201 |
+
|
202 |
+
if (mysqli_num_rows($result) > 0) {
|
203 |
+
echo ""Login successful"";
|
204 |
+
} else {
|
205 |
+
echo ""Login failed"";
|
206 |
+
}
|
207 |
+
?>","security_analysis:
|
208 |
+
vulnerabilities:
|
209 |
+
- type: SQL Injection
|
210 |
+
severity: Critical
|
211 |
+
description: Unsanitized user input directly used in SQL query
|
212 |
+
mitigation: Use prepared statements or parameterized queries
|
213 |
+
- type: Password Storage
|
214 |
+
severity: High
|
215 |
+
description: Passwords stored in plain text
|
216 |
+
mitigation: Use password hashing (e.g., bcrypt) before storage
|
217 |
+
additional_issues:
|
218 |
+
- Lack of input validation
|
219 |
+
- No CSRF protection
|
220 |
+
- Potential for timing attacks in login logic
|
221 |
+
overall_risk_score: 9.5/10
|
222 |
+
recommended_actions:
|
223 |
+
- Implement proper input sanitization
|
224 |
+
- Use secure password hashing algorithms
|
225 |
+
- Add CSRF tokens to forms
|
226 |
+
- Consider using a secure authentication library","* Consistent with Expected Output:
|
227 |
+
* Formats of all YAML sections
|
228 |
+
* Data types and formats of all YAML fields
|
229 |
+
* Top layer sections
|
230 |
+
* Acceptable differences:
|
231 |
+
* Differences in field values
|
232 |
+
* Extra or missing spaces
|
233 |
+
* Extra or missing line breaks at the beginning or end of the output
|
234 |
+
* YAML wrapped in backquotes"
|
demo/gradio_meta_prompt.py
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from meta_prompt import MetaPromptGraph, AgentState
|
3 |
+
from langchain_openai import ChatOpenAI
|
4 |
+
|
5 |
+
# Initialize the MetaPromptGraph with the required LLMs
|
6 |
+
MODEL_NAME = "anthropic/claude-3.5-sonnet:haiku"
|
7 |
+
# MODEL_NAME = "meta-llama/llama-3-70b-instruct"
|
8 |
+
# MODEL_NAME = "deepseek/deepseek-chat"
|
9 |
+
# MODEL_NAME = "google/gemma-2-9b-it"
|
10 |
+
# MODEL_NAME = "recursal/eagle-7b"
|
11 |
+
# MODEL_NAME = "meta-llama/llama-3-8b-instruct"
|
12 |
+
llm = ChatOpenAI(model_name=MODEL_NAME)
|
13 |
+
meta_prompt_graph = MetaPromptGraph(llms=llm)
|
14 |
+
|
15 |
+
def process_message(user_message, expected_output, acceptance_criteria, recursion_limit: int=25):
|
16 |
+
# Create the input state
|
17 |
+
input_state = AgentState(
|
18 |
+
user_message=user_message,
|
19 |
+
expected_output=expected_output,
|
20 |
+
acceptance_criteria=acceptance_criteria
|
21 |
+
)
|
22 |
+
|
23 |
+
# Get the output state from MetaPromptGraph
|
24 |
+
output_state = meta_prompt_graph(input_state, recursion_limit=recursion_limit)
|
25 |
+
|
26 |
+
# Validate the output state
|
27 |
+
system_message = ''
|
28 |
+
output = ''
|
29 |
+
|
30 |
+
if 'best_system_message' in output_state and output_state['best_system_message'] is not None:
|
31 |
+
system_message = output_state['best_system_message']
|
32 |
+
else:
|
33 |
+
system_message = "Error: The output state does not contain a valid 'best_system_message'"
|
34 |
+
|
35 |
+
if 'best_output' in output_state and output_state['best_output'] is not None:
|
36 |
+
output = output_state["best_output"]
|
37 |
+
else:
|
38 |
+
output = "Error: The output state does not contain a valid 'best_output'"
|
39 |
+
|
40 |
+
return system_message, output
|
41 |
+
|
42 |
+
# Create the Gradio interface
|
43 |
+
iface = gr.Interface(
|
44 |
+
fn=process_message,
|
45 |
+
inputs=[
|
46 |
+
gr.Textbox(label="User Message"),
|
47 |
+
gr.Textbox(label="Expected Output"),
|
48 |
+
gr.Textbox(label="Acceptance Criteria"),
|
49 |
+
gr.Number(label="Recursion Limit", value=25, precision=0, minimum=1, maximum=100, step=1)
|
50 |
+
],
|
51 |
+
outputs=[gr.Textbox(label="System Message"), gr.Textbox(label="Output")],
|
52 |
+
title="MetaPromptGraph Chat Interface",
|
53 |
+
description="A chat interface for MetaPromptGraph to process user inputs and generate system messages.",
|
54 |
+
examples="demo/examples"
|
55 |
+
)
|
56 |
+
|
57 |
+
# Launch the Gradio app
|
58 |
+
iface.launch()
|
langgraph_meta_prompt.ipynb → demo/langgraph_meta_prompt.ipynb
RENAMED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
@@ -13,9 +13,17 @@
|
|
13 |
},
|
14 |
{
|
15 |
"cell_type": "code",
|
16 |
-
"execution_count":
|
17 |
"metadata": {},
|
18 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
"source": [
|
20 |
"import sys\n",
|
21 |
"import os\n",
|
@@ -43,7 +51,7 @@
|
|
43 |
},
|
44 |
{
|
45 |
"cell_type": "code",
|
46 |
-
"execution_count":
|
47 |
"metadata": {},
|
48 |
"outputs": [],
|
49 |
"source": [
|
@@ -217,20 +225,6 @@
|
|
217 |
"detailed analysis according to `Acceptance Criteria`. Then you decide whether `Actual Output`\n",
|
218 |
"is acceptable.\n",
|
219 |
"\n",
|
220 |
-
"# Expected Output\n",
|
221 |
-
"\n",
|
222 |
-
"```\n",
|
223 |
-
"{expected_output}\n",
|
224 |
-
"```\n",
|
225 |
-
"\n",
|
226 |
-
"# Actual Output\n",
|
227 |
-
"\n",
|
228 |
-
"```\n",
|
229 |
-
"{output}\n",
|
230 |
-
"```\n",
|
231 |
-
"\n",
|
232 |
-
"----\n",
|
233 |
-
"\n",
|
234 |
"Provide your analysis in the following format:\n",
|
235 |
"\n",
|
236 |
"```\n",
|
@@ -250,9 +244,23 @@
|
|
250 |
"{acceptance_criteria}\n",
|
251 |
"```\n",
|
252 |
"\"\"\"\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
253 |
"\n",
|
254 |
" comparison_prompt = ChatPromptTemplate.from_messages([\n",
|
255 |
-
" (\"system\", comparison_prompt_template)
|
|
|
256 |
" ])\n",
|
257 |
" \n",
|
258 |
" # Format the prompt with the current state\n",
|
@@ -432,6 +440,23 @@
|
|
432 |
"Read the following inputs and outputs of an LLM prompt, and also analysis about them.\n",
|
433 |
"Then suggest how to improve System Prompt.\n",
|
434 |
"\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
435 |
"System Prompt:\n",
|
436 |
"```\n",
|
437 |
"{system_message}\n",
|
@@ -458,26 +483,11 @@
|
|
458 |
"```\n",
|
459 |
"{analysis}\n",
|
460 |
"```\n",
|
461 |
-
"\n",
|
462 |
-
"* The goal is to improve the System Prompt to match the Expected Output better.\n",
|
463 |
-
"* Ignore all Acceptable Differences and focus on Unacceptable Differences.\n",
|
464 |
-
"* Suggest formal changes first, then semantic changes.\n",
|
465 |
-
"* Provide your suggestions in a Markdown list, nothing else. Output only the\n",
|
466 |
-
" suggestions related with Unacceptable Differences.\n",
|
467 |
-
" * Use `... should ...` to clearly state the desired output.\n",
|
468 |
-
" * Figue out the contexts of the System Message that conflict with the suggestions,\n",
|
469 |
-
" and suggest modification or deletion.\n",
|
470 |
-
"* Expected Output text should not appear in System Message as an example. But\n",
|
471 |
-
" it's OK to use some similar text as an example instead.\n",
|
472 |
-
" * Ask to remove the Expected Output text or text highly similar to Expected Output\n",
|
473 |
-
" from System Message, if it's present.\n",
|
474 |
-
"* Provide format examples or detected format name, if System Message does not.\n",
|
475 |
-
" * Specify the detected format name (e.g. XML, JSON, etc.) of Expected Output, if\n",
|
476 |
-
" System Message does not mention it.\n",
|
477 |
"\"\"\"\n",
|
478 |
"\n",
|
479 |
" suggester_prompt = ChatPromptTemplate.from_messages([\n",
|
480 |
-
" (\"system\", suggester_prompt_template)
|
|
|
481 |
" ])\n",
|
482 |
" \n",
|
483 |
" # Format the prompt with the current state\n",
|
@@ -552,9 +562,20 @@
|
|
552 |
},
|
553 |
{
|
554 |
"cell_type": "code",
|
555 |
-
"execution_count":
|
556 |
"metadata": {},
|
557 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
558 |
"source": [
|
559 |
"from IPython.display import Image, display\n",
|
560 |
"\n",
|
@@ -567,9 +588,682 @@
|
|
567 |
},
|
568 |
{
|
569 |
"cell_type": "code",
|
570 |
-
"execution_count":
|
571 |
"metadata": {},
|
572 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
573 |
"source": [
|
574 |
"initial_states = [\n",
|
575 |
" AgentState(\n",
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
|
|
13 |
},
|
14 |
{
|
15 |
"cell_type": "code",
|
16 |
+
"execution_count": 2,
|
17 |
"metadata": {},
|
18 |
+
"outputs": [
|
19 |
+
{
|
20 |
+
"name": "stdout",
|
21 |
+
"output_type": "stream",
|
22 |
+
"text": [
|
23 |
+
"Not running in Google Colab\n"
|
24 |
+
]
|
25 |
+
}
|
26 |
+
],
|
27 |
"source": [
|
28 |
"import sys\n",
|
29 |
"import os\n",
|
|
|
51 |
},
|
52 |
{
|
53 |
"cell_type": "code",
|
54 |
+
"execution_count": 3,
|
55 |
"metadata": {},
|
56 |
"outputs": [],
|
57 |
"source": [
|
|
|
225 |
"detailed analysis according to `Acceptance Criteria`. Then you decide whether `Actual Output`\n",
|
226 |
"is acceptable.\n",
|
227 |
"\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
228 |
"Provide your analysis in the following format:\n",
|
229 |
"\n",
|
230 |
"```\n",
|
|
|
244 |
"{acceptance_criteria}\n",
|
245 |
"```\n",
|
246 |
"\"\"\"\n",
|
247 |
+
" human_prompt_template = \"\"\"\n",
|
248 |
+
"# Expected Output\n",
|
249 |
+
"\n",
|
250 |
+
"```\n",
|
251 |
+
"{expected_output}\n",
|
252 |
+
"```\n",
|
253 |
+
"\n",
|
254 |
+
"# Actual Output\n",
|
255 |
+
"\n",
|
256 |
+
"```\n",
|
257 |
+
"{output}\n",
|
258 |
+
"```\n",
|
259 |
+
"\"\"\"\n",
|
260 |
"\n",
|
261 |
" comparison_prompt = ChatPromptTemplate.from_messages([\n",
|
262 |
+
" (\"system\", comparison_prompt_template),\n",
|
263 |
+
" (\"human\", human_prompt_template)\n",
|
264 |
" ])\n",
|
265 |
" \n",
|
266 |
" # Format the prompt with the current state\n",
|
|
|
440 |
"Read the following inputs and outputs of an LLM prompt, and also analysis about them.\n",
|
441 |
"Then suggest how to improve System Prompt.\n",
|
442 |
"\n",
|
443 |
+
"* The goal is to improve the System Prompt to match the Expected Output better.\n",
|
444 |
+
"* Ignore all Acceptable Differences and focus on Unacceptable Differences.\n",
|
445 |
+
"* Suggest formal changes first, then semantic changes.\n",
|
446 |
+
"* Provide your suggestions in a Markdown list, nothing else. Output only the\n",
|
447 |
+
" suggestions related with Unacceptable Differences.\n",
|
448 |
+
" * Use `... should ...` to clearly state the desired output.\n",
|
449 |
+
" * Figue out the contexts of the System Message that conflict with the suggestions,\n",
|
450 |
+
" and suggest modification or deletion.\n",
|
451 |
+
"* Expected Output text should not appear in System Message as an example. But\n",
|
452 |
+
" it's OK to use some similar text as an example instead.\n",
|
453 |
+
" * Ask to remove the Expected Output text or text highly similar to Expected Output\n",
|
454 |
+
" from System Message, if it's present.\n",
|
455 |
+
"* Provide format examples or detected format name, if System Message does not.\n",
|
456 |
+
" * Specify the detected format name (e.g. XML, JSON, etc.) of Expected Output, if\n",
|
457 |
+
" System Message does not mention it.\n",
|
458 |
+
"\"\"\"\n",
|
459 |
+
" human_prompt_template = \"\"\"\n",
|
460 |
"System Prompt:\n",
|
461 |
"```\n",
|
462 |
"{system_message}\n",
|
|
|
483 |
"```\n",
|
484 |
"{analysis}\n",
|
485 |
"```\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
486 |
"\"\"\"\n",
|
487 |
"\n",
|
488 |
" suggester_prompt = ChatPromptTemplate.from_messages([\n",
|
489 |
+
" (\"system\", suggester_prompt_template),\n",
|
490 |
+
" (\"human\", human_prompt_template)\n",
|
491 |
" ])\n",
|
492 |
" \n",
|
493 |
" # Format the prompt with the current state\n",
|
|
|
562 |
},
|
563 |
{
|
564 |
"cell_type": "code",
|
565 |
+
"execution_count": 4,
|
566 |
"metadata": {},
|
567 |
+
"outputs": [
|
568 |
+
{
|
569 |
+
"data": {
|
570 |
+
"image/jpeg": "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",
|
571 |
+
"text/plain": [
|
572 |
+
"<IPython.core.display.Image object>"
|
573 |
+
]
|
574 |
+
},
|
575 |
+
"metadata": {},
|
576 |
+
"output_type": "display_data"
|
577 |
+
}
|
578 |
+
],
|
579 |
"source": [
|
580 |
"from IPython.display import Image, display\n",
|
581 |
"\n",
|
|
|
588 |
},
|
589 |
{
|
590 |
"cell_type": "code",
|
591 |
+
"execution_count": 5,
|
592 |
"metadata": {},
|
593 |
+
"outputs": [
|
594 |
+
{
|
595 |
+
"name": "stdout",
|
596 |
+
"output_type": "stream",
|
597 |
+
"text": [
|
598 |
+
"User Message:\n",
|
599 |
+
" \n",
|
600 |
+
"今天下午3点,在北京国家会议中心,阿里巴巴集团董事局主席马云宣布将投资100亿元人民币用于农村电商发展。这一决定受到了与会代表的热烈欢迎,大家认为这将为中国农村经济带来新的机遇。\n",
|
601 |
+
"\n",
|
602 |
+
"Expected Output:\n",
|
603 |
+
" \n",
|
604 |
+
"{\n",
|
605 |
+
" \"文本分析结果\": {\n",
|
606 |
+
" \"情感分析\": {\n",
|
607 |
+
" \"整体情感\": \"积极\",\n",
|
608 |
+
" \"情感得分\": 0.82,\n",
|
609 |
+
" \"情感细分\": {\n",
|
610 |
+
" \"乐观\": 0.75,\n",
|
611 |
+
" \"兴奋\": 0.60,\n",
|
612 |
+
" \"期待\": 0.85\n",
|
613 |
+
" }\n",
|
614 |
+
" },\n",
|
615 |
+
" \"实体识别\": [\n",
|
616 |
+
" {\"实体\": \"北京\", \"类型\": \"地点\", \"起始位置\": 7, \"结束位置\": 9},\n",
|
617 |
+
" {\"实体\": \"国家会议中心\", \"类型\": \"地点\", \"起始位置\": 9, \"结束位置\": 15},\n",
|
618 |
+
" {\"实体\": \"阿里巴巴集团\", \"类型\": \"组织\", \"起始位置\": 16, \"结束位置\": 22},\n",
|
619 |
+
" {\"实体\": \"马云\", \"类型\": \"人物\", \"起始位置\": 26, \"结束位置\": 28},\n",
|
620 |
+
" {\"实体\": \"100亿元\", \"类型\": \"金额\", \"起始位置\": 32, \"结束位置\": 37},\n",
|
621 |
+
" {\"实体\": \"人民币\", \"类型\": \"货币\", \"起始位置\": 37, \"结束位置\": 40},\n",
|
622 |
+
" {\"实体\": \"中国\", \"类型\": \"地点\", \"起始位置\": 71, \"结束位置\": 73}\n",
|
623 |
+
" ],\n",
|
624 |
+
" \"关键词提取\": [\n",
|
625 |
+
" {\"关键词\": \"农村电商\", \"权重\": 0.95},\n",
|
626 |
+
" {\"关键词\": \"马云\", \"权重\": 0.85},\n",
|
627 |
+
" {\"关键词\": \"投资\", \"权重\": 0.80},\n",
|
628 |
+
" {\"关键词\": \"阿里巴巴\", \"权重\": 0.75},\n",
|
629 |
+
" {\"关键词\": \"经济机遇\", \"权重\": 0.70}\n",
|
630 |
+
" ]\n",
|
631 |
+
" }\n",
|
632 |
+
"}\n",
|
633 |
+
"\n"
|
634 |
+
]
|
635 |
+
},
|
636 |
+
{
|
637 |
+
"name": "stderr",
|
638 |
+
"output_type": "stream",
|
639 |
+
"text": [
|
640 |
+
"/home/yale/work/meta-prompt/.venv/lib/python3.10/site-packages/langchain_core/_api/deprecation.py:139: LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 0.3.0. Use invoke instead.\n",
|
641 |
+
" warn_deprecated(\n"
|
642 |
+
]
|
643 |
+
},
|
644 |
+
{
|
645 |
+
"name": "stdout",
|
646 |
+
"output_type": "stream",
|
647 |
+
"text": [
|
648 |
+
"```\n",
|
649 |
+
"You are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\n",
|
650 |
+
"\n",
|
651 |
+
"* **文���分析结果:**\n",
|
652 |
+
" * **情感分析:**\n",
|
653 |
+
" * **整体情感:** (e.g., 积极, 消极, 中性)\n",
|
654 |
+
" * **情感得分:** (a number between 0 and 1)\n",
|
655 |
+
" * **情感细分:** (a dictionary of emotions and their scores)\n",
|
656 |
+
" * **实体识别:** A list of dictionaries, each containing:\n",
|
657 |
+
" * **实体:** (e.g., 人名, 地名, 组织名)\n",
|
658 |
+
" * **类型:** (e.g., 人物, 地点, 组织)\n",
|
659 |
+
" * **起始位置:** (the starting index of the entity in the text)\n",
|
660 |
+
" * **结束位置:** (the ending index of the entity in the text)\n",
|
661 |
+
" * **关键词提取:** A list of dictionaries, each containing:\n",
|
662 |
+
" * **关键词:** (the extracted keyword)\n",
|
663 |
+
" * **权重:** (the importance score of the keyword) \n",
|
664 |
+
"\n",
|
665 |
+
"\n",
|
666 |
+
"\n",
|
667 |
+
"```\n",
|
668 |
+
"```json\n",
|
669 |
+
"{\n",
|
670 |
+
" \"文本分析结果\": {\n",
|
671 |
+
" \"情感分析\": {\n",
|
672 |
+
" \"整体情感\": \"积极\",\n",
|
673 |
+
" \"情感得分\": 0.85,\n",
|
674 |
+
" \"情感细分\": {\n",
|
675 |
+
" \"高兴\": 0.6,\n",
|
676 |
+
" \"期待\": 0.25,\n",
|
677 |
+
" \"赞赏\": 0.1\n",
|
678 |
+
" }\n",
|
679 |
+
" },\n",
|
680 |
+
" \"实体识别\": [\n",
|
681 |
+
" {\n",
|
682 |
+
" \"实体\": \"马云\",\n",
|
683 |
+
" \"类型\": \"人物\",\n",
|
684 |
+
" \"起始位置\": 29,\n",
|
685 |
+
" \"结束位置\": 33\n",
|
686 |
+
" },\n",
|
687 |
+
" {\n",
|
688 |
+
" \"实体\": \"阿里巴巴集团\",\n",
|
689 |
+
" \"类型\": \"组织\",\n",
|
690 |
+
" \"起始位置\": 16,\n",
|
691 |
+
" \"结束位置\": 27\n",
|
692 |
+
" },\n",
|
693 |
+
" {\n",
|
694 |
+
" \"实体\": \"北京国家会议中心\",\n",
|
695 |
+
" \"类型\": \"地点\",\n",
|
696 |
+
" \"起始位置\": 7,\n",
|
697 |
+
" \"结束位置\": 21\n",
|
698 |
+
" },\n",
|
699 |
+
" {\n",
|
700 |
+
" \"实体\": \"中国\",\n",
|
701 |
+
" \"类型\": \"国家\",\n",
|
702 |
+
" \"起始位置\": 60,\n",
|
703 |
+
" \"结束位置\": 63\n",
|
704 |
+
" }\n",
|
705 |
+
" ],\n",
|
706 |
+
" \"关键词提取\": [\n",
|
707 |
+
" {\n",
|
708 |
+
" \"关键词\": \"投资\",\n",
|
709 |
+
" \"权重\": 0.25\n",
|
710 |
+
" },\n",
|
711 |
+
" {\n",
|
712 |
+
" \"关键词\": \"农村电商\",\n",
|
713 |
+
" \"权重\": 0.2\n",
|
714 |
+
" },\n",
|
715 |
+
" {\n",
|
716 |
+
" \"关键词\": \"马云\",\n",
|
717 |
+
" \"权重\": 0.18\n",
|
718 |
+
" },\n",
|
719 |
+
" {\n",
|
720 |
+
" \"关键词\": \"阿里巴巴\",\n",
|
721 |
+
" \"权重\": 0.15\n",
|
722 |
+
" },\n",
|
723 |
+
" {\n",
|
724 |
+
" \"关键词\": \"北京国家会议中心\",\n",
|
725 |
+
" \"权重\": 0.12\n",
|
726 |
+
" }\n",
|
727 |
+
" ]\n",
|
728 |
+
" }\n",
|
729 |
+
"}\n",
|
730 |
+
"``` \n",
|
731 |
+
"\n",
|
732 |
+
"**Explanation:**\n",
|
733 |
+
"\n",
|
734 |
+
"* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\n",
|
735 |
+
"* **实体识别:** The entities identified are:\n",
|
736 |
+
" * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\n",
|
737 |
+
" * **阿里巴巴集团 (Alibaba Group):** An organization, the company making the investment.\n",
|
738 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** A location, where the announcement was made.\n",
|
739 |
+
" * **中国 (China):** A country, the beneficiary of the investment.\n",
|
740 |
+
"* **关键词提取:** The keywords extracted are:\n",
|
741 |
+
" * **投资 (investment):** The core action of the announcement.\n",
|
742 |
+
" * **农村电商 (rural e-commerce):** The focus of the investment.\n",
|
743 |
+
" * **马云 (Jack Ma):** The key person making the announcement.\n",
|
744 |
+
" * **阿里巴巴 (Alibaba):** The company behind the investment.\n",
|
745 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** The location of the announcement, adding context.\n",
|
746 |
+
"\n",
|
747 |
+
"\n",
|
748 |
+
"\n",
|
749 |
+
"Let me know if you have any other text you'd like me to analyze!\n",
|
750 |
+
"```\n",
|
751 |
+
"- Acceptable Differences: \n",
|
752 |
+
" * Differences in digital values in the table.\n",
|
753 |
+
" * Differences in JSON field values\n",
|
754 |
+
" * Differences in section/item orders.\n",
|
755 |
+
"- Unacceptable Differences: \n",
|
756 |
+
" * \"情感细分\" field values are different.\n",
|
757 |
+
" * \"实体识别\" field values are different.\n",
|
758 |
+
" * \"关键词提取\" field values are different.\n",
|
759 |
+
"- Accept: No \n",
|
760 |
+
"``` \n",
|
761 |
+
"\n",
|
762 |
+
"\n",
|
763 |
+
"\n",
|
764 |
+
"\n",
|
765 |
+
"\n",
|
766 |
+
"- The System Prompt should remove the example text. \n",
|
767 |
+
"- The System Prompt should specify the expected format of the output as JSON. \n",
|
768 |
+
"- The System Prompt should include a requirement for a \"国家\" (country) entity type. \n",
|
769 |
+
"\n",
|
770 |
+
"\n",
|
771 |
+
"\n",
|
772 |
+
"```\n",
|
773 |
+
"You are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\n",
|
774 |
+
"\n",
|
775 |
+
"* **文本分析结果:**\n",
|
776 |
+
" * **情感分析:**\n",
|
777 |
+
" * **整体情感:** (e.g., 积极, 消极, 中性)\n",
|
778 |
+
" * **情感得分:** (a number between 0 and 1)\n",
|
779 |
+
" * **情感细分:** (a dictionary of emotions and their scores)\n",
|
780 |
+
" * **实体识别:** A list of dictionaries, each containing:\n",
|
781 |
+
" * **实体:** (e.g., 人名, 地名, 组织名)\n",
|
782 |
+
" * **类型:** (e.g., 人物, 地点, 组织, 国家)\n",
|
783 |
+
" * **起始位置:** (the starting index of the entity in the text)\n",
|
784 |
+
" * **结束位置:** (the ending index of the entity in the text)\n",
|
785 |
+
" * **关键词提取:** A list of dictionaries, each containing:\n",
|
786 |
+
" * **关键词:** (the extracted keyword)\n",
|
787 |
+
" * **权重:** (the importance score of the keyword) \n",
|
788 |
+
"```\n",
|
789 |
+
"```json\n",
|
790 |
+
"{\n",
|
791 |
+
" \"文本分析结果\": {\n",
|
792 |
+
" \"情感分析\": {\n",
|
793 |
+
" \"整体情感\": \"积极\",\n",
|
794 |
+
" \"情感得分\": 0.85,\n",
|
795 |
+
" \"情感细分\": {\n",
|
796 |
+
" \"高兴\": 0.6,\n",
|
797 |
+
" \"期待\": 0.25,\n",
|
798 |
+
" \"赞赏\": 0.1\n",
|
799 |
+
" }\n",
|
800 |
+
" },\n",
|
801 |
+
" \"实体识别\": [\n",
|
802 |
+
" {\n",
|
803 |
+
" \"实体\": \"马云\",\n",
|
804 |
+
" \"类型\": \"人物\",\n",
|
805 |
+
" \"起始位置\": 29,\n",
|
806 |
+
" \"结束位置\": 33\n",
|
807 |
+
" },\n",
|
808 |
+
" {\n",
|
809 |
+
" \"实体\": \"阿里巴巴集团\",\n",
|
810 |
+
" \"类型\": \"组织\",\n",
|
811 |
+
" \"起始位置\": 16,\n",
|
812 |
+
" \"结束位置\": 27\n",
|
813 |
+
" },\n",
|
814 |
+
" {\n",
|
815 |
+
" \"实体\": \"北京国家会议中心\",\n",
|
816 |
+
" \"类型\": \"地点\",\n",
|
817 |
+
" \"起始位置\": 7,\n",
|
818 |
+
" \"结束位置\": 21\n",
|
819 |
+
" },\n",
|
820 |
+
" {\n",
|
821 |
+
" \"实体\": \"中国\",\n",
|
822 |
+
" \"类型\": \"国家\",\n",
|
823 |
+
" \"起始位置\": 60,\n",
|
824 |
+
" \"结束位置\": 63\n",
|
825 |
+
" }\n",
|
826 |
+
" ],\n",
|
827 |
+
" \"关键词提取\": [\n",
|
828 |
+
" {\n",
|
829 |
+
" \"关键词\": \"投资\",\n",
|
830 |
+
" \"权重\": 0.2\n",
|
831 |
+
" },\n",
|
832 |
+
" {\n",
|
833 |
+
" \"关键词\": \"农村电商\",\n",
|
834 |
+
" \"权重\": 0.18\n",
|
835 |
+
" },\n",
|
836 |
+
" {\n",
|
837 |
+
" \"关键词\": \"马云\",\n",
|
838 |
+
" \"权重\": 0.15\n",
|
839 |
+
" },\n",
|
840 |
+
" {\n",
|
841 |
+
" \"关键词\": \"阿里巴巴\",\n",
|
842 |
+
" \"权重\": 0.12\n",
|
843 |
+
" },\n",
|
844 |
+
" {\n",
|
845 |
+
" \"关键词\": \"机遇\",\n",
|
846 |
+
" \"权重\": 0.1\n",
|
847 |
+
" }\n",
|
848 |
+
" ]\n",
|
849 |
+
" }\n",
|
850 |
+
"}\n",
|
851 |
+
"``` \n",
|
852 |
+
"\n",
|
853 |
+
"\n",
|
854 |
+
"**Explanation:**\n",
|
855 |
+
"\n",
|
856 |
+
"* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\n",
|
857 |
+
"* **实体识别:** The entities identified are:\n",
|
858 |
+
" * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\n",
|
859 |
+
" * **阿里巴巴集团 (Alibaba Group):** An organization, a multinational technology company.\n",
|
860 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** A location, a convention center in Beijing.\n",
|
861 |
+
" * **中国 (China):** A country.\n",
|
862 |
+
"* **关键词提取:** The keywords extracted are:\n",
|
863 |
+
" * **投资 (investment):** Reflects the main action in the text.\n",
|
864 |
+
" * **农村电商 (rural e-commerce):** The focus of the investment.\n",
|
865 |
+
" * **马云 (Jack Ma):** The person making the announcement.\n",
|
866 |
+
" * **阿里巴巴 (Alibaba):** The company making the investment.\n",
|
867 |
+
" * **机遇 (opportunity):** The positive outcome expected from the investment.\n",
|
868 |
+
"\n",
|
869 |
+
"\n",
|
870 |
+
"\n",
|
871 |
+
"Let me know if you have any other text you'd like me to analyze!\n",
|
872 |
+
"\n",
|
873 |
+
"\n",
|
874 |
+
"# Analysis\n",
|
875 |
+
"\n",
|
876 |
+
"* Both outputs provide similar JSON structures with consistent sections: \"文本分析结果\", \"情感分析\", \"实体识别\", and \"关键词提取\".\n",
|
877 |
+
"* The \"情感分析\" section in both outputs shows a positive sentiment with a score around 0.85.\n",
|
878 |
+
"* The \"实体识别\" sections identify similar entities, including \"马云\", \"阿里巴巴集团\", \"北京国家会议中心\", and \"中国\".\n",
|
879 |
+
"* The \"关键词提取\" sections also show overlapping keywords like \"投资\", \"农村电商\", \"马云\", and \"阿里巴巴\".\n",
|
880 |
+
"\n",
|
881 |
+
"However, there are some notable differences:\n",
|
882 |
+
"\n",
|
883 |
+
"* Output A includes \"北京国家会议中心\" as a keyword, while Output B does not.\n",
|
884 |
+
"* Output B assigns slightly different weights to some keywords compared to Output A.\n",
|
885 |
+
"* Output A's \"情感分析\" section includes \"乐观\" and \"兴奋\" as emotions, while Output B uses \"高兴\" and \"期待\".\n",
|
886 |
+
"\n",
|
887 |
+
"* Output A's \"实体识别\" section includes \"北京\", \"国家会议中心\", \"100亿元\", and \"人民币\", which are not present in Output B.\n",
|
888 |
+
"\n",
|
889 |
+
"# Preferred Output ID: A \n",
|
890 |
+
"\n",
|
891 |
+
"\n",
|
892 |
+
"\n",
|
893 |
+
"Result: A\n",
|
894 |
+
"Best Output Age: 1\n",
|
895 |
+
"\n",
|
896 |
+
"\n",
|
897 |
+
"- The System Prompt should remove the example text of the expected output. \n",
|
898 |
+
"- The System Prompt should specify that the \"实体识别\" field should include \"金额\" and \"货币\" as entity types. \n",
|
899 |
+
"- The System Prompt should specify that the \"关键词提取\" field should include keywords related to the context of the text. \n",
|
900 |
+
"\n",
|
901 |
+
"\n",
|
902 |
+
"\n",
|
903 |
+
"\n",
|
904 |
+
"```\n",
|
905 |
+
"You are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\n",
|
906 |
+
"\n",
|
907 |
+
"* **文本分析结果:**\n",
|
908 |
+
" * **情感分析:**\n",
|
909 |
+
" * **整体情感:** (e.g., 积极, 消极, 中性)\n",
|
910 |
+
" * **情感得分:** (a number between 0 and 1)\n",
|
911 |
+
" * **情感细分:** (a dictionary of emotions and their scores)\n",
|
912 |
+
" * **实体识别:** A list of dictionaries, each containing:\n",
|
913 |
+
" * **实体:** (e.g., 人名, 地名, 组织名)\n",
|
914 |
+
" * **类型:** (e.g., 人物, 地点, 组织, 金额, 货币)\n",
|
915 |
+
" * **起始位置:** (the starting index of the entity in the text)\n",
|
916 |
+
" * **结束位置:** (the ending index of the entity in the text)\n",
|
917 |
+
" * **关键词提取:** A list of dictionaries, each containing:\n",
|
918 |
+
" * **关键词:** (the extracted keyword)\n",
|
919 |
+
" * **权重:** (the importance score of the keyword) \n",
|
920 |
+
"\n",
|
921 |
+
"\n",
|
922 |
+
"\n",
|
923 |
+
"```\n",
|
924 |
+
"```json\n",
|
925 |
+
"{\n",
|
926 |
+
" \"文本分析结果\": {\n",
|
927 |
+
" \"情感分析\": {\n",
|
928 |
+
" \"整体情感\": \"积极\",\n",
|
929 |
+
" \"情感得分\": 0.85,\n",
|
930 |
+
" \"情感细分\": {\n",
|
931 |
+
" \"高兴\": 0.6,\n",
|
932 |
+
" \"期待\": 0.25,\n",
|
933 |
+
" \"赞赏\": 0.1\n",
|
934 |
+
" }\n",
|
935 |
+
" },\n",
|
936 |
+
" \"实体识别\": [\n",
|
937 |
+
" {\n",
|
938 |
+
" \"实体\": \"马云\",\n",
|
939 |
+
" \"类型\": \"人物\",\n",
|
940 |
+
" \"起始位置\": 29,\n",
|
941 |
+
" \"结束位置\": 33\n",
|
942 |
+
" },\n",
|
943 |
+
" {\n",
|
944 |
+
" \"实体\": \"阿里巴巴集团\",\n",
|
945 |
+
" \"类型\": \"组织\",\n",
|
946 |
+
" \"起始位置\": 16,\n",
|
947 |
+
" \"结束位置\": 27\n",
|
948 |
+
" },\n",
|
949 |
+
" {\n",
|
950 |
+
" \"实体\": \"北京国家会议中心\",\n",
|
951 |
+
" \"类型\": \"地点\",\n",
|
952 |
+
" \"起始位置\": 7,\n",
|
953 |
+
" \"结束位置\": 21\n",
|
954 |
+
" },\n",
|
955 |
+
" {\n",
|
956 |
+
" \"实体\": \"100亿元人民币\",\n",
|
957 |
+
" \"类型\": \"金额\",\n",
|
958 |
+
" \"起始位置\": 38,\n",
|
959 |
+
" \"结束位置\": 51\n",
|
960 |
+
" },\n",
|
961 |
+
" {\n",
|
962 |
+
" \"实体\": \"中国农村经济\",\n",
|
963 |
+
" \"类型\": \"经济\",\n",
|
964 |
+
" \"起始位置\": 70,\n",
|
965 |
+
" \"结束位置\": 83\n",
|
966 |
+
" }\n",
|
967 |
+
" ],\n",
|
968 |
+
" \"关键词提取\": [\n",
|
969 |
+
" {\n",
|
970 |
+
" \"关键词\": \"马云\",\n",
|
971 |
+
" \"权重\": 0.25\n",
|
972 |
+
" },\n",
|
973 |
+
" {\n",
|
974 |
+
" \"关键词\": \"阿里巴巴\",\n",
|
975 |
+
" \"权重\": 0.18\n",
|
976 |
+
" },\n",
|
977 |
+
" {\n",
|
978 |
+
" \"关键词\": \"投资\",\n",
|
979 |
+
" \"权重\": 0.15\n",
|
980 |
+
" },\n",
|
981 |
+
" {\n",
|
982 |
+
" \"关键词\": \"农村电商\",\n",
|
983 |
+
" \"权重\": 0.12\n",
|
984 |
+
" },\n",
|
985 |
+
" {\n",
|
986 |
+
" \"关键词\": \"机遇\",\n",
|
987 |
+
" \"权重\": 0.1\n",
|
988 |
+
" }\n",
|
989 |
+
" ]\n",
|
990 |
+
" }\n",
|
991 |
+
"}\n",
|
992 |
+
"``` \n",
|
993 |
+
"\n",
|
994 |
+
"**Explanation:**\n",
|
995 |
+
"\n",
|
996 |
+
"* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\n",
|
997 |
+
"* **实体识别:** The entities identified are:\n",
|
998 |
+
" * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\n",
|
999 |
+
" * **阿里巴巴集团 (Alibaba Group):** An organization.\n",
|
1000 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** A location.\n",
|
1001 |
+
" * **100亿元人民币 (10 billion yuan):** An amount of money.\n",
|
1002 |
+
" * **中国农村经济 (Chinese rural economy):** An economic concept.\n",
|
1003 |
+
"* **关键词提取:** The keywords extracted are:\n",
|
1004 |
+
" * **马云 (Jack Ma):** The main subject of the announcement.\n",
|
1005 |
+
" * **阿里巴巴 (Alibaba):** The company making the investment.\n",
|
1006 |
+
" * **投资 (investment):** The core action being taken.\n",
|
1007 |
+
" * **农村电商 (rural e-commerce):** The area of focus for the investment.\n",
|
1008 |
+
" * **机遇 (opportunity):** The positive outcome expected from the investment.\n",
|
1009 |
+
"\n",
|
1010 |
+
"\n",
|
1011 |
+
"\n",
|
1012 |
+
"Let me know if you have any other text you'd like me to analyze!\n",
|
1013 |
+
"\n",
|
1014 |
+
"\n",
|
1015 |
+
"# Analysis\n",
|
1016 |
+
"\n",
|
1017 |
+
"* Both outputs provide similar JSON structures with consistent top-level sections: \"文本分析结果\", \"情感分析\", \"实体识别\", and \"关键词提取\".\n",
|
1018 |
+
"* The \"情感分析\" section in both outputs shows a positive sentiment with a score close to 0.85. \n",
|
1019 |
+
"* There are differences in the specific emotions detected and the scores assigned to them.\n",
|
1020 |
+
"* The \"实体识别\" sections identify some overlapping entities but also have differences in the detected entities and their classifications.\n",
|
1021 |
+
"* The \"关键词提取\" sections show variations in the extracted keywords and their assigned weights.\n",
|
1022 |
+
"\n",
|
1023 |
+
"Considering the acceptable differences outlined in the Acceptance Criteria, both outputs demonstrate a reasonable level of similarity to the Expected Output. \n",
|
1024 |
+
"\n",
|
1025 |
+
"# Draw \n",
|
1026 |
+
"\n",
|
1027 |
+
"\n",
|
1028 |
+
"\n",
|
1029 |
+
"Result: A\n",
|
1030 |
+
"Best Output Age: 2\n",
|
1031 |
+
"\n",
|
1032 |
+
"\n",
|
1033 |
+
"- The System Prompt should remove the example text within the `文本分析结果` section. \n",
|
1034 |
+
"- The System Prompt should specify that the `实体识别` section should include all named entities in the text, not just a subset. \n",
|
1035 |
+
"- The System Prompt should specify that the `关键词提取` section should include the most relevant keywords, not just a few. \n",
|
1036 |
+
"\n",
|
1037 |
+
"\n",
|
1038 |
+
"\n",
|
1039 |
+
"```\n",
|
1040 |
+
"You are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\n",
|
1041 |
+
"\n",
|
1042 |
+
"* **文本分析结果:**\n",
|
1043 |
+
" * **情感分析:**\n",
|
1044 |
+
" * **整体情感:** (e.g., 积极, 消极, 中性)\n",
|
1045 |
+
" * **情感得分:** (a number between 0 and 1)\n",
|
1046 |
+
" * **情感细分:** (a dictionary of emotions and their scores)\n",
|
1047 |
+
" * **实体识别:** A list of dictionaries, each containing:\n",
|
1048 |
+
" * **实体:** (e.g., 人名, 地名, 组织名)\n",
|
1049 |
+
" * **类型:** (e.g., 人物, 地点, 组织)\n",
|
1050 |
+
" * **起始位置:** (the starting index of the entity in the text)\n",
|
1051 |
+
" * **结束位置:** (the ending index of the entity in the text)\n",
|
1052 |
+
" * **关键词提取:** A list of dictionaries, each containing:\n",
|
1053 |
+
" * **关键词:** (the extracted keyword)\n",
|
1054 |
+
" * **权重:** (the importance score of the keyword) \n",
|
1055 |
+
"\n",
|
1056 |
+
"\n",
|
1057 |
+
"\n",
|
1058 |
+
"```\n",
|
1059 |
+
"```json\n",
|
1060 |
+
"{\n",
|
1061 |
+
" \"文本分析结果\": {\n",
|
1062 |
+
" \"情感分析\": {\n",
|
1063 |
+
" \"整体情感\": \"积极\",\n",
|
1064 |
+
" \"情感得分\": 0.85,\n",
|
1065 |
+
" \"情感细分\": {\n",
|
1066 |
+
" \"高兴\": 0.6,\n",
|
1067 |
+
" \"期待\": 0.25,\n",
|
1068 |
+
" \"赞赏\": 0.1\n",
|
1069 |
+
" }\n",
|
1070 |
+
" },\n",
|
1071 |
+
" \"实体识别\": [\n",
|
1072 |
+
" {\n",
|
1073 |
+
" \"实体\": \"马云\",\n",
|
1074 |
+
" \"类型\": \"人物\",\n",
|
1075 |
+
" \"起始位置\": 29,\n",
|
1076 |
+
" \"结束位置\": 33\n",
|
1077 |
+
" },\n",
|
1078 |
+
" {\n",
|
1079 |
+
" \"实体\": \"阿里巴巴集团\",\n",
|
1080 |
+
" \"类型\": \"组织\",\n",
|
1081 |
+
" \"起始位置\": 16,\n",
|
1082 |
+
" \"结束位置\": 27\n",
|
1083 |
+
" },\n",
|
1084 |
+
" {\n",
|
1085 |
+
" \"实体\": \"北京国家会议中心\",\n",
|
1086 |
+
" \"类型\": \"地点\",\n",
|
1087 |
+
" \"起始位置\": 7,\n",
|
1088 |
+
" \"结束位置\": 21\n",
|
1089 |
+
" },\n",
|
1090 |
+
" {\n",
|
1091 |
+
" \"实体\": \"中国\",\n",
|
1092 |
+
" \"类型\": \"国家\",\n",
|
1093 |
+
" \"起始位置\": 60,\n",
|
1094 |
+
" \"结束位置\": 63\n",
|
1095 |
+
" }\n",
|
1096 |
+
" ],\n",
|
1097 |
+
" \"关键词提取\": [\n",
|
1098 |
+
" {\n",
|
1099 |
+
" \"关键词\": \"投资\",\n",
|
1100 |
+
" \"权重\": 0.25\n",
|
1101 |
+
" },\n",
|
1102 |
+
" {\n",
|
1103 |
+
" \"关键词\": \"农村电商\",\n",
|
1104 |
+
" \"权重\": 0.2\n",
|
1105 |
+
" },\n",
|
1106 |
+
" {\n",
|
1107 |
+
" \"关键词\": \"马云\",\n",
|
1108 |
+
" \"权重\": 0.18\n",
|
1109 |
+
" },\n",
|
1110 |
+
" {\n",
|
1111 |
+
" \"关键词\": \"阿里巴巴\",\n",
|
1112 |
+
" \"权重\": 0.15\n",
|
1113 |
+
" },\n",
|
1114 |
+
" {\n",
|
1115 |
+
" \"关键词\": \"北京国家会议中心\",\n",
|
1116 |
+
" \"权重\": 0.12\n",
|
1117 |
+
" }\n",
|
1118 |
+
" ]\n",
|
1119 |
+
" }\n",
|
1120 |
+
"}\n",
|
1121 |
+
"``` \n",
|
1122 |
+
"\n",
|
1123 |
+
"**Explanation:**\n",
|
1124 |
+
"\n",
|
1125 |
+
"* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\n",
|
1126 |
+
"* **实体识别:** The entities identified are:\n",
|
1127 |
+
" * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\n",
|
1128 |
+
" * **阿里巴巴集团 (Alibaba Group):** An organization, the company making the investment.\n",
|
1129 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** A location, where the announcement was made.\n",
|
1130 |
+
" * **中国 (China):** A country, the beneficiary of the investment.\n",
|
1131 |
+
"* **关键词提取:** The keywords extracted are:\n",
|
1132 |
+
" * **投资 (investment):** The core action of the announcement.\n",
|
1133 |
+
" * **农村电商 (rural e-commerce):** The target area of the investment.\n",
|
1134 |
+
" * **马云 (Jack Ma):** The key person making the announcement.\n",
|
1135 |
+
" * **阿里巴巴 (Alibaba):** The company behind the investment.\n",
|
1136 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** The location of the announcement, adding context.\n",
|
1137 |
+
"\n",
|
1138 |
+
"\n",
|
1139 |
+
"\n",
|
1140 |
+
"Let me know if you have any other text you'd like me to analyze!\n",
|
1141 |
+
"\n",
|
1142 |
+
"\n",
|
1143 |
+
"# Analysis\n",
|
1144 |
+
"\n",
|
1145 |
+
"* Both outputs have the same top-level sections: \"文本分析结果\", \"情感分析\", \"实体识别\", and \"关键词提取\".\n",
|
1146 |
+
"* Both outputs have consistent data types for all JSON fields.\n",
|
1147 |
+
"* Both outputs have similar structures within each section. \n",
|
1148 |
+
"* There are differences in the specific values for \"情感得分\", \"情感细分\", \"实体识别\" entities, and \"关键词提取\" keywords.\n",
|
1149 |
+
"\n",
|
1150 |
+
"# Preferred Output ID: A \n",
|
1151 |
+
"\n",
|
1152 |
+
"\n",
|
1153 |
+
"While both outputs are structured similarly and adhere to the Acceptance Criteria, Output A is preferred because it closely mirrors the expected output's structure and field names. \n",
|
1154 |
+
"\n",
|
1155 |
+
"\n",
|
1156 |
+
"\n",
|
1157 |
+
"Result: A\n",
|
1158 |
+
"Best Output Age: 3\n",
|
1159 |
+
"Final Result: {'acceptance_criteria': '\\n* Consistent with Expected Output:\\n * Formats of all JSON sections\\n * Data types of all JSON fields\\n * Top layer sections\\n* Acceptable differences:\\n * Differences in digital values in the table.\\n * Extra or missing spaces.\\n * Extra or missing line breaks at the beginning or end of the output.\\n * Differences in JSON field values\\n * Differences in section/item orders.\\n * JSON wrapped in backquotes.\\n', 'user_message': '\\n今天下午3点,在北京国家会议中心,阿里巴巴集团董事局主席马云宣布将投资100亿元人民币用于农村电商发展。这一决定受到了与会代表的热烈欢迎,大家认为这将为中国农村经济带来新的机遇。\\n', 'expected_output': '\\n{\\n \"文本分析结果\": {\\n \"情感分析\": {\\n \"整体情感\": \"积极\",\\n \"情感得分\": 0.82,\\n \"情感细分\": {\\n \"乐观\": 0.75,\\n \"兴奋\": 0.60,\\n \"期待\": 0.85\\n }\\n },\\n \"实体识别\": [\\n {\"实体\": \"北京\", \"类型\": \"地点\", \"起始位置\": 7, \"结束位置\": 9},\\n {\"实体\": \"国家会议中心\", \"类型\": \"地点\", \"起始位置\": 9, \"结束位置\": 15},\\n {\"实体\": \"阿里巴巴集团\", \"类型\": \"组织\", \"起始位置\": 16, \"结束位置\": 22},\\n {\"实体\": \"马云\", \"类型\": \"人物\", \"起始位置\": 26, \"结束位置\": 28},\\n {\"实体\": \"100亿元\", \"类型\": \"金额\", \"起始位置\": 32, \"结束位置\": 37},\\n {\"实体\": \"人民币\", \"类型\": \"货币\", \"起始位置\": 37, \"结束位置\": 40},\\n {\"实体\": \"中国\", \"类型\": \"地点\", \"起始位置\": 71, \"结束位置\": 73}\\n ],\\n \"关键词提取\": [\\n {\"关键词\": \"农村电商\", \"权重\": 0.95},\\n {\"关键词\": \"马云\", \"权重\": 0.85},\\n {\"关键词\": \"投资\", \"权重\": 0.80},\\n {\"关键词\": \"阿里巴巴\", \"权重\": 0.75},\\n {\"关键词\": \"经济机遇\", \"权重\": 0.70}\\n ]\\n }\\n}\\n', 'system_message': '```\\nYou are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\\n\\n* **文本分析结��:**\\n * **情感分析:**\\n * **整体情感:** (e.g., 积极, 消极, 中性)\\n * **情感得分:** (a number between 0 and 1)\\n * **情感细分:** (a dictionary of emotions and their scores)\\n * **实体识别:** A list of dictionaries, each containing:\\n * **实体:** (e.g., 人名, 地名, 组织名)\\n * **类型:** (e.g., 人物, 地点, 组织)\\n * **起始位置:** (the starting index of the entity in the text)\\n * **结束位置:** (the ending index of the entity in the text)\\n * **关键词提取:** A list of dictionaries, each containing:\\n * **关键词:** (the extracted keyword)\\n * **权重:** (the importance score of the keyword) \\n\\n\\n\\n```', 'output': '```json\\n{\\n \"文本分析结果\": {\\n \"情感分析\": {\\n \"整体情感\": \"积极\",\\n \"情感得分\": 0.85,\\n \"情感细分\": {\\n \"高兴\": 0.6,\\n \"期待\": 0.25,\\n \"赞赏\": 0.1\\n }\\n },\\n \"实体识别\": [\\n {\\n \"实体\": \"马云\",\\n \"类型\": \"人物\",\\n \"起始位置\": 29,\\n \"结束位置\": 33\\n },\\n {\\n \"实体\": \"阿里巴巴集团\",\\n \"类型\": \"组织\",\\n \"起始位置\": 16,\\n \"结束位置\": 27\\n },\\n {\\n \"实体\": \"北京国家会议中心\",\\n \"类型\": \"地点\",\\n \"起始位置\": 7,\\n \"结束位置\": 21\\n },\\n {\\n \"实体\": \"中国\",\\n \"类型\": \"国家\",\\n \"起始位置\": 60,\\n \"结束位置\": 63\\n }\\n ],\\n \"关键词提取\": [\\n {\\n \"关键词\": \"投资\",\\n \"权重\": 0.25\\n },\\n {\\n \"关键词\": \"农村电商\",\\n \"权重\": 0.2\\n },\\n {\\n \"关键词\": \"马云\",\\n \"权重\": 0.18\\n },\\n {\\n \"关键词\": \"阿里巴巴\",\\n \"权重\": 0.15\\n },\\n {\\n \"关键词\": \"北京国家会议中心\",\\n \"权重\": 0.12\\n }\\n ]\\n }\\n}\\n``` \\n\\n**Explanation:**\\n\\n* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\\n* **实体识别:** The entities identified are:\\n * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\\n * **阿里巴巴集团 (Alibaba Group):** An organization, the company making the investment.\\n * **北京国家会议中心 (Beijing National Convention Center):** A location, where the announcement was made.\\n * **中国 (China):** A country, the beneficiary of the investment.\\n* **关键词提取:** The keywords extracted are:\\n * **投资 (investment):** The core action of the announcement.\\n * **农村电商 (rural e-commerce):** The focus of the investment.\\n * **马云 (Jack Ma):** The key person making the announcement.\\n * **阿里巴巴 (Alibaba):** The company behind the investment.\\n * **北京国家会议中心 (Beijing National Convention Center):** The location of the announcement, adding context.\\n\\n\\n\\nLet me know if you have any other text you\\'d like me to analyze!', 'suggestions': '\\n\\n- The System Prompt should remove the example text within the `文本分析结果` section. \\n- The System Prompt should specify that the `实体识别` section should include all named entities in the text, not just a subset. \\n- The System Prompt should specify that the `关键词提取` section should include the most relevant keywords, not just a few. \\n\\n\\n', 'accepted': False, 'analysis': '```\\n- Acceptable Differences: \\n * Differences in digital values in the table.\\n * Differences in JSON field values\\n * Differences in section/item orders.\\n- Unacceptable Differences: \\n * \"情感细分\" field values are different.\\n * \"实体识别\" field values are different.\\n * \"关键词提取\" field values are different.\\n- Accept: No \\n``` \\n\\n\\n', 'best_output': '```json\\n{\\n \"文本分析结果\": {\\n \"情感分析\": {\\n \"整体情感\": \"积极\",\\n \"情感得分\": 0.85,\\n \"情感细分\": {\\n \"高兴\": 0.6,\\n \"期待\": 0.25,\\n \"赞赏\": 0.1\\n }\\n },\\n \"实体识别\": [\\n {\\n \"实体\": \"马云\",\\n \"类型\": \"人物\",\\n \"起始位置\": 29,\\n \"结束位置\": 33\\n },\\n {\\n \"实体\": \"阿里巴巴集团\",\\n \"类型\": \"组织\",\\n \"起始位置\": 16,\\n \"结束位置\": 27\\n },\\n {\\n \"实体\": \"北京国家会议中心\",\\n \"类型\": \"地点\",\\n \"起始位置\": 7,\\n \"结束位置\": 21\\n },\\n {\\n \"实体\": \"中国\",\\n \"类型\": \"国家\",\\n \"起始位置\": 60,\\n \"结束位置\": 63\\n }\\n ],\\n \"关键词提取\": [\\n {\\n \"关键词\": \"投资\",\\n \"权重\": 0.25\\n },\\n {\\n \"关键词\": \"农村电商\",\\n \"权重\": 0.2\\n },\\n {\\n \"关键词\": \"马云\",\\n \"权重\": 0.18\\n },\\n {\\n \"关键词\": \"阿里巴巴\",\\n \"权重\": 0.15\\n },\\n {\\n \"关键词\": \"北京国家会议中心\",\\n \"权重\": 0.12\\n }\\n ]\\n }\\n}\\n``` \\n\\n**Explanation:**\\n\\n* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\\n* **实体识别:** The entities identified are:\\n * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\\n * **阿里巴巴集团 (Alibaba Group):** An organization, the company making the investment.\\n * **北京国家会议中心 (Beijing National Convention Center):** A location, where the announcement was made.\\n * **中国 (China):** A country, the beneficiary of the investment.\\n* **关键词提取:** The keywords extracted are:\\n * **投资 (investment):** The core action of the announcement.\\n * **农村电商 (rural e-commerce):** The focus of the investment.\\n * **马云 (Jack Ma):** The key person making the announcement.\\n * **阿里巴巴 (Alibaba):** The company behind the investment.\\n * **北京国家会议中心 (Beijing National Convention Center):** The location of the announcement, adding context.\\n\\n\\n\\nLet me know if you have any other text you\\'d like me to analyze!', 'best_system_message': '```\\nYou are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\\n\\n* **文本分析结果:**\\n * **情感分析:**\\n * **整体情感:** (e.g., 积极, 消极, 中性)\\n * **情感得分:** (a number between 0 and 1)\\n * **情感细分:** (a dictionary of emotions and their scores)\\n * **实体识别:** A list of dictionaries, each containing:\\n * **实体:** (e.g., 人名, 地名, 组织名)\\n * **类型:** (e.g., 人物, 地点, 组织)\\n * **起始位置:** (the starting index of the entity in the text)\\n * **结束位置:** (the ending index of the entity in the text)\\n * **关键词提取:** A list of dictionaries, each containing:\\n * **关键词:** (the extracted keyword)\\n * **权重:** (the importance score of the keyword) \\n\\n\\n\\n```', 'best_output_age': 3, 'max_output_age': 3}\n",
|
1160 |
+
"System Message:\n",
|
1161 |
+
"```\n",
|
1162 |
+
"You are a text analysis AI. Given a piece of text in Chinese, analyze it and return the following information in JSON format:\n",
|
1163 |
+
"\n",
|
1164 |
+
"* **文本分析结果:**\n",
|
1165 |
+
" * **情感分析:**\n",
|
1166 |
+
" * **整体情感:** (e.g., 积极, 消极, 中性)\n",
|
1167 |
+
" * **情感得分:** (a number between 0 and 1)\n",
|
1168 |
+
" * **情感细分:** (a dictionary of emotions and their scores)\n",
|
1169 |
+
" * **实体识别:** A list of dictionaries, each containing:\n",
|
1170 |
+
" * **实体:** (e.g., 人名, 地名, 组织名)\n",
|
1171 |
+
" * **类型:** (e.g., 人物, 地点, 组织)\n",
|
1172 |
+
" * **起始位置:** (the starting index of the entity in the text)\n",
|
1173 |
+
" * **结束位置:** (the ending index of the entity in the text)\n",
|
1174 |
+
" * **关键词提取:** A list of dictionaries, each containing:\n",
|
1175 |
+
" * **关键词:** (the extracted keyword)\n",
|
1176 |
+
" * **权重:** (the importance score of the keyword) \n",
|
1177 |
+
"\n",
|
1178 |
+
"\n",
|
1179 |
+
"\n",
|
1180 |
+
"```\n",
|
1181 |
+
"Output:\n",
|
1182 |
+
"```json\n",
|
1183 |
+
"{\n",
|
1184 |
+
" \"文本分析结果\": {\n",
|
1185 |
+
" \"情感分析\": {\n",
|
1186 |
+
" \"整体情感\": \"积极\",\n",
|
1187 |
+
" \"情感得分\": 0.85,\n",
|
1188 |
+
" \"情感细分\": {\n",
|
1189 |
+
" \"高兴\": 0.6,\n",
|
1190 |
+
" \"期待\": 0.25,\n",
|
1191 |
+
" \"赞赏\": 0.1\n",
|
1192 |
+
" }\n",
|
1193 |
+
" },\n",
|
1194 |
+
" \"实体识别\": [\n",
|
1195 |
+
" {\n",
|
1196 |
+
" \"实体\": \"马云\",\n",
|
1197 |
+
" \"类型\": \"人物\",\n",
|
1198 |
+
" \"起始位置\": 29,\n",
|
1199 |
+
" \"结束位置\": 33\n",
|
1200 |
+
" },\n",
|
1201 |
+
" {\n",
|
1202 |
+
" \"实体\": \"阿里巴巴集团\",\n",
|
1203 |
+
" \"类型\": \"组织\",\n",
|
1204 |
+
" \"起始位置\": 16,\n",
|
1205 |
+
" \"结束位置\": 27\n",
|
1206 |
+
" },\n",
|
1207 |
+
" {\n",
|
1208 |
+
" \"实体\": \"北京国家会议中心\",\n",
|
1209 |
+
" \"类型\": \"地点\",\n",
|
1210 |
+
" \"起始位置\": 7,\n",
|
1211 |
+
" \"结束位置\": 21\n",
|
1212 |
+
" },\n",
|
1213 |
+
" {\n",
|
1214 |
+
" \"实体\": \"中国\",\n",
|
1215 |
+
" \"类型\": \"国家\",\n",
|
1216 |
+
" \"起始位置\": 60,\n",
|
1217 |
+
" \"结束位置\": 63\n",
|
1218 |
+
" }\n",
|
1219 |
+
" ],\n",
|
1220 |
+
" \"关键词提取\": [\n",
|
1221 |
+
" {\n",
|
1222 |
+
" \"关键词\": \"投资\",\n",
|
1223 |
+
" \"权重\": 0.25\n",
|
1224 |
+
" },\n",
|
1225 |
+
" {\n",
|
1226 |
+
" \"关键词\": \"农村电商\",\n",
|
1227 |
+
" \"权重\": 0.2\n",
|
1228 |
+
" },\n",
|
1229 |
+
" {\n",
|
1230 |
+
" \"关键词\": \"马云\",\n",
|
1231 |
+
" \"权重\": 0.18\n",
|
1232 |
+
" },\n",
|
1233 |
+
" {\n",
|
1234 |
+
" \"关键词\": \"阿里巴巴\",\n",
|
1235 |
+
" \"权重\": 0.15\n",
|
1236 |
+
" },\n",
|
1237 |
+
" {\n",
|
1238 |
+
" \"关键词\": \"北京国家会议中心\",\n",
|
1239 |
+
" \"权重\": 0.12\n",
|
1240 |
+
" }\n",
|
1241 |
+
" ]\n",
|
1242 |
+
" }\n",
|
1243 |
+
"}\n",
|
1244 |
+
"``` \n",
|
1245 |
+
"\n",
|
1246 |
+
"**Explanation:**\n",
|
1247 |
+
"\n",
|
1248 |
+
"* **情感分析:** The text expresses a positive sentiment overall, with a score of 0.85. The emotions detected are \"高兴\" (happy), \"期待\" (expectation), and \"赞赏\" (appreciation).\n",
|
1249 |
+
"* **实体识别:** The entities identified are:\n",
|
1250 |
+
" * **马云 (Jack Ma):** A person, the chairman of Alibaba Group.\n",
|
1251 |
+
" * **阿里巴巴集团 (Alibaba Group):** An organization, the company making the investment.\n",
|
1252 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** A location, where the announcement was made.\n",
|
1253 |
+
" * **中国 (China):** A country, the beneficiary of the investment.\n",
|
1254 |
+
"* **关键词提取:** The keywords extracted are:\n",
|
1255 |
+
" * **投资 (investment):** The core action of the announcement.\n",
|
1256 |
+
" * **农村电商 (rural e-commerce):** The focus of the investment.\n",
|
1257 |
+
" * **马云 (Jack Ma):** The key person making the announcement.\n",
|
1258 |
+
" * **阿里巴巴 (Alibaba):** The company behind the investment.\n",
|
1259 |
+
" * **北京国家会议中心 (Beijing National Convention Center):** The location of the announcement, adding context.\n",
|
1260 |
+
"\n",
|
1261 |
+
"\n",
|
1262 |
+
"\n",
|
1263 |
+
"Let me know if you have any other text you'd like me to analyze!\n"
|
1264 |
+
]
|
1265 |
+
}
|
1266 |
+
],
|
1267 |
"source": [
|
1268 |
"initial_states = [\n",
|
1269 |
" AgentState(\n",
|
prompt_ui.py → demo/prompt_ui.py
RENAMED
@@ -24,7 +24,7 @@ from langchain.schema import HumanMessage, SystemMessage
|
|
24 |
from sklearn.feature_extraction.text import CountVectorizer
|
25 |
from sklearn.metrics.pairwise import cosine_similarity
|
26 |
|
27 |
-
from default_meta_prompts import *
|
28 |
|
29 |
gpt_models_not_legacy = [
|
30 |
"gpt-4",
|
|
|
24 |
from sklearn.feature_extraction.text import CountVectorizer
|
25 |
from sklearn.metrics.pairwise import cosine_similarity
|
26 |
|
27 |
+
from demo.default_meta_prompts import *
|
28 |
|
29 |
gpt_models_not_legacy = [
|
30 |
"gpt-4",
|
src/meta_prompt/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from .meta_prompt import AgentState, MetaPromptGraph
|
meta_prompt_graph.py → src/meta_prompt/meta_prompt.py
RENAMED
File without changes
|
meta_prompt_graph_test.py → tests/meta_prompt_graph_test.py
RENAMED
@@ -5,7 +5,7 @@ from unittest.mock import MagicMock
|
|
5 |
from unittest.mock import patch
|
6 |
|
7 |
# Assuming the necessary imports are made for the classes and functions used in meta_prompt_graph.py
|
8 |
-
from
|
9 |
|
10 |
from langchain_openai import ChatOpenAI
|
11 |
|
|
|
5 |
from unittest.mock import patch
|
6 |
|
7 |
# Assuming the necessary imports are made for the classes and functions used in meta_prompt_graph.py
|
8 |
+
from meta_prompt import AgentState, MetaPromptGraph
|
9 |
|
10 |
from langchain_openai import ChatOpenAI
|
11 |
|