edsl 0.1.39.dev3__py3-none-any.whl → 0.1.39.dev4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edsl/Base.py +413 -332
- edsl/BaseDiff.py +260 -260
- edsl/TemplateLoader.py +24 -24
- edsl/__init__.py +57 -49
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +1071 -867
- edsl/agents/AgentList.py +551 -413
- edsl/agents/Invigilator.py +284 -233
- edsl/agents/InvigilatorBase.py +257 -270
- edsl/agents/PromptConstructor.py +272 -354
- edsl/agents/QuestionInstructionPromptBuilder.py +128 -0
- edsl/agents/QuestionTemplateReplacementsBuilder.py +137 -0
- edsl/agents/__init__.py +2 -3
- edsl/agents/descriptors.py +99 -99
- edsl/agents/prompt_helpers.py +129 -129
- edsl/agents/question_option_processor.py +172 -0
- edsl/auto/AutoStudy.py +130 -117
- edsl/auto/StageBase.py +243 -230
- edsl/auto/StageGenerateSurvey.py +178 -178
- edsl/auto/StageLabelQuestions.py +125 -125
- edsl/auto/StagePersona.py +61 -61
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -88
- edsl/auto/StagePersonaDimensionValues.py +74 -74
- edsl/auto/StagePersonaDimensions.py +69 -69
- edsl/auto/StageQuestions.py +74 -73
- edsl/auto/SurveyCreatorPipeline.py +21 -21
- edsl/auto/utilities.py +218 -224
- edsl/base/Base.py +279 -279
- edsl/config.py +177 -157
- edsl/conversation/Conversation.py +290 -290
- edsl/conversation/car_buying.py +59 -58
- edsl/conversation/chips.py +95 -95
- edsl/conversation/mug_negotiation.py +81 -81
- edsl/conversation/next_speaker_utilities.py +93 -93
- edsl/coop/CoopFunctionsMixin.py +15 -0
- edsl/coop/ExpectedParrotKeyHandler.py +125 -0
- edsl/coop/PriceFetcher.py +54 -54
- edsl/coop/__init__.py +2 -2
- edsl/coop/coop.py +1106 -1028
- edsl/coop/utils.py +131 -131
- edsl/data/Cache.py +573 -555
- edsl/data/CacheEntry.py +230 -233
- edsl/data/CacheHandler.py +168 -149
- edsl/data/RemoteCacheSync.py +186 -78
- edsl/data/SQLiteDict.py +292 -292
- edsl/data/__init__.py +5 -4
- edsl/data/hack.py +10 -0
- edsl/data/orm.py +10 -10
- edsl/data_transfer_models.py +74 -73
- edsl/enums.py +202 -175
- edsl/exceptions/BaseException.py +21 -21
- edsl/exceptions/__init__.py +54 -54
- edsl/exceptions/agents.py +54 -42
- edsl/exceptions/cache.py +5 -5
- edsl/exceptions/configuration.py +16 -16
- edsl/exceptions/coop.py +10 -10
- edsl/exceptions/data.py +14 -14
- edsl/exceptions/general.py +34 -34
- edsl/exceptions/inference_services.py +5 -0
- edsl/exceptions/jobs.py +33 -33
- edsl/exceptions/language_models.py +63 -63
- edsl/exceptions/prompts.py +15 -15
- edsl/exceptions/questions.py +109 -91
- edsl/exceptions/results.py +29 -29
- edsl/exceptions/scenarios.py +29 -22
- edsl/exceptions/surveys.py +37 -37
- edsl/inference_services/AnthropicService.py +106 -87
- edsl/inference_services/AvailableModelCacheHandler.py +184 -0
- edsl/inference_services/AvailableModelFetcher.py +215 -0
- edsl/inference_services/AwsBedrock.py +118 -120
- edsl/inference_services/AzureAI.py +215 -217
- edsl/inference_services/DeepInfraService.py +18 -18
- edsl/inference_services/GoogleService.py +143 -148
- edsl/inference_services/GroqService.py +20 -20
- edsl/inference_services/InferenceServiceABC.py +80 -147
- edsl/inference_services/InferenceServicesCollection.py +138 -97
- edsl/inference_services/MistralAIService.py +120 -123
- edsl/inference_services/OllamaService.py +18 -18
- edsl/inference_services/OpenAIService.py +236 -224
- edsl/inference_services/PerplexityService.py +160 -163
- edsl/inference_services/ServiceAvailability.py +135 -0
- edsl/inference_services/TestService.py +90 -89
- edsl/inference_services/TogetherAIService.py +172 -170
- edsl/inference_services/data_structures.py +134 -0
- edsl/inference_services/models_available_cache.py +118 -118
- edsl/inference_services/rate_limits_cache.py +25 -25
- edsl/inference_services/registry.py +41 -41
- edsl/inference_services/write_available.py +10 -10
- edsl/jobs/AnswerQuestionFunctionConstructor.py +223 -0
- edsl/jobs/Answers.py +43 -56
- edsl/jobs/FetchInvigilator.py +47 -0
- edsl/jobs/InterviewTaskManager.py +98 -0
- edsl/jobs/InterviewsConstructor.py +50 -0
- edsl/jobs/Jobs.py +823 -898
- edsl/jobs/JobsChecks.py +172 -147
- edsl/jobs/JobsComponentConstructor.py +189 -0
- edsl/jobs/JobsPrompts.py +270 -268
- edsl/jobs/JobsRemoteInferenceHandler.py +311 -239
- edsl/jobs/JobsRemoteInferenceLogger.py +239 -0
- edsl/jobs/RequestTokenEstimator.py +30 -0
- edsl/jobs/__init__.py +1 -1
- edsl/jobs/async_interview_runner.py +138 -0
- edsl/jobs/buckets/BucketCollection.py +104 -63
- edsl/jobs/buckets/ModelBuckets.py +65 -65
- edsl/jobs/buckets/TokenBucket.py +283 -251
- edsl/jobs/buckets/TokenBucketAPI.py +211 -0
- edsl/jobs/buckets/TokenBucketClient.py +191 -0
- edsl/jobs/check_survey_scenario_compatibility.py +85 -0
- edsl/jobs/data_structures.py +120 -0
- edsl/jobs/decorators.py +35 -0
- edsl/jobs/interviews/Interview.py +396 -661
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -99
- edsl/jobs/interviews/InterviewExceptionEntry.py +186 -186
- edsl/jobs/interviews/InterviewStatistic.py +63 -63
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -25
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -78
- edsl/jobs/interviews/InterviewStatusLog.py +92 -92
- edsl/jobs/interviews/ReportErrors.py +66 -66
- edsl/jobs/interviews/interview_status_enum.py +9 -9
- edsl/jobs/jobs_status_enums.py +9 -0
- edsl/jobs/loggers/HTMLTableJobLogger.py +304 -0
- edsl/jobs/results_exceptions_handler.py +98 -0
- edsl/jobs/runners/JobsRunnerAsyncio.py +151 -466
- edsl/jobs/runners/JobsRunnerStatus.py +297 -330
- edsl/jobs/tasks/QuestionTaskCreator.py +244 -242
- edsl/jobs/tasks/TaskCreators.py +64 -64
- edsl/jobs/tasks/TaskHistory.py +470 -450
- edsl/jobs/tasks/TaskStatusLog.py +23 -23
- edsl/jobs/tasks/task_status_enum.py +161 -163
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -27
- edsl/jobs/tokens/TokenUsage.py +34 -34
- edsl/language_models/ComputeCost.py +63 -0
- edsl/language_models/LanguageModel.py +626 -668
- edsl/language_models/ModelList.py +164 -155
- edsl/language_models/PriceManager.py +127 -0
- edsl/language_models/RawResponseHandler.py +106 -0
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -184
- edsl/language_models/ServiceDataSources.py +0 -0
- edsl/language_models/__init__.py +2 -3
- edsl/language_models/fake_openai_call.py +15 -15
- edsl/language_models/fake_openai_service.py +61 -61
- edsl/language_models/key_management/KeyLookup.py +63 -0
- edsl/language_models/key_management/KeyLookupBuilder.py +273 -0
- edsl/language_models/key_management/KeyLookupCollection.py +38 -0
- edsl/language_models/key_management/__init__.py +0 -0
- edsl/language_models/key_management/models.py +131 -0
- edsl/language_models/model.py +256 -0
- edsl/language_models/repair.py +156 -156
- edsl/language_models/utilities.py +65 -64
- edsl/notebooks/Notebook.py +263 -258
- edsl/notebooks/NotebookToLaTeX.py +142 -0
- edsl/notebooks/__init__.py +1 -1
- edsl/prompts/Prompt.py +352 -362
- edsl/prompts/__init__.py +2 -2
- edsl/questions/ExceptionExplainer.py +77 -0
- edsl/questions/HTMLQuestion.py +103 -0
- edsl/questions/QuestionBase.py +518 -664
- edsl/questions/QuestionBasePromptsMixin.py +221 -217
- edsl/questions/QuestionBudget.py +227 -227
- edsl/questions/QuestionCheckBox.py +359 -359
- edsl/questions/QuestionExtract.py +180 -182
- edsl/questions/QuestionFreeText.py +113 -114
- edsl/questions/QuestionFunctional.py +166 -166
- edsl/questions/QuestionList.py +223 -231
- edsl/questions/QuestionMatrix.py +265 -0
- edsl/questions/QuestionMultipleChoice.py +330 -286
- edsl/questions/QuestionNumerical.py +151 -153
- edsl/questions/QuestionRank.py +314 -324
- edsl/questions/Quick.py +41 -41
- edsl/questions/SimpleAskMixin.py +74 -73
- edsl/questions/__init__.py +27 -26
- edsl/questions/{AnswerValidatorMixin.py → answer_validator_mixin.py} +334 -289
- edsl/questions/compose_questions.py +98 -98
- edsl/questions/data_structures.py +20 -0
- edsl/questions/decorators.py +21 -21
- edsl/questions/derived/QuestionLikertFive.py +76 -76
- edsl/questions/derived/QuestionLinearScale.py +90 -87
- edsl/questions/derived/QuestionTopK.py +93 -93
- edsl/questions/derived/QuestionYesNo.py +82 -82
- edsl/questions/descriptors.py +427 -413
- edsl/questions/loop_processor.py +149 -0
- edsl/questions/prompt_templates/question_budget.jinja +13 -13
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -32
- edsl/questions/prompt_templates/question_extract.jinja +11 -11
- edsl/questions/prompt_templates/question_free_text.jinja +3 -3
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -11
- edsl/questions/prompt_templates/question_list.jinja +17 -17
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -33
- edsl/questions/prompt_templates/question_numerical.jinja +36 -36
- edsl/questions/{QuestionBaseGenMixin.py → question_base_gen_mixin.py} +168 -161
- edsl/questions/question_registry.py +177 -177
- edsl/questions/{RegisterQuestionsMeta.py → register_questions_meta.py} +71 -71
- edsl/questions/{ResponseValidatorABC.py → response_validator_abc.py} +188 -174
- edsl/questions/response_validator_factory.py +34 -0
- edsl/questions/settings.py +12 -12
- edsl/questions/templates/budget/answering_instructions.jinja +7 -7
- edsl/questions/templates/budget/question_presentation.jinja +7 -7
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -10
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -22
- edsl/questions/templates/extract/answering_instructions.jinja +7 -7
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -10
- edsl/questions/templates/likert_five/question_presentation.jinja +11 -11
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -5
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -5
- edsl/questions/templates/list/answering_instructions.jinja +3 -3
- edsl/questions/templates/list/question_presentation.jinja +5 -5
- edsl/questions/templates/matrix/__init__.py +1 -0
- edsl/questions/templates/matrix/answering_instructions.jinja +5 -0
- edsl/questions/templates/matrix/question_presentation.jinja +20 -0
- edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -9
- edsl/questions/templates/multiple_choice/question_presentation.jinja +11 -11
- edsl/questions/templates/numerical/answering_instructions.jinja +6 -6
- edsl/questions/templates/numerical/question_presentation.jinja +6 -6
- edsl/questions/templates/rank/answering_instructions.jinja +11 -11
- edsl/questions/templates/rank/question_presentation.jinja +15 -15
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -8
- edsl/questions/templates/top_k/question_presentation.jinja +22 -22
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -6
- edsl/questions/templates/yes_no/question_presentation.jinja +11 -11
- edsl/results/CSSParameterizer.py +108 -108
- edsl/results/Dataset.py +587 -424
- edsl/results/DatasetExportMixin.py +594 -731
- edsl/results/DatasetTree.py +295 -275
- edsl/results/MarkdownToDocx.py +122 -0
- edsl/results/MarkdownToPDF.py +111 -0
- edsl/results/Result.py +557 -465
- edsl/results/Results.py +1183 -1165
- edsl/results/ResultsExportMixin.py +45 -43
- edsl/results/ResultsGGMixin.py +121 -121
- edsl/results/TableDisplay.py +125 -198
- edsl/results/TextEditor.py +50 -0
- edsl/results/__init__.py +2 -2
- edsl/results/file_exports.py +252 -0
- edsl/results/{ResultsFetchMixin.py → results_fetch_mixin.py} +33 -33
- edsl/results/{Selector.py → results_selector.py} +145 -135
- edsl/results/{ResultsToolsMixin.py → results_tools_mixin.py} +98 -98
- edsl/results/smart_objects.py +96 -0
- edsl/results/table_data_class.py +12 -0
- edsl/results/table_display.css +77 -77
- edsl/results/table_renderers.py +118 -0
- edsl/results/tree_explore.py +115 -115
- edsl/scenarios/ConstructDownloadLink.py +109 -0
- edsl/scenarios/DocumentChunker.py +102 -0
- edsl/scenarios/DocxScenario.py +16 -0
- edsl/scenarios/FileStore.py +511 -632
- edsl/scenarios/PdfExtractor.py +40 -0
- edsl/scenarios/Scenario.py +498 -601
- edsl/scenarios/ScenarioHtmlMixin.py +65 -64
- edsl/scenarios/ScenarioList.py +1458 -1287
- edsl/scenarios/ScenarioListExportMixin.py +45 -52
- edsl/scenarios/ScenarioListPdfMixin.py +239 -261
- edsl/scenarios/__init__.py +3 -4
- edsl/scenarios/directory_scanner.py +96 -0
- edsl/scenarios/file_methods.py +85 -0
- edsl/scenarios/handlers/__init__.py +13 -0
- edsl/scenarios/handlers/csv.py +38 -0
- edsl/scenarios/handlers/docx.py +76 -0
- edsl/scenarios/handlers/html.py +37 -0
- edsl/scenarios/handlers/json.py +111 -0
- edsl/scenarios/handlers/latex.py +5 -0
- edsl/scenarios/handlers/md.py +51 -0
- edsl/scenarios/handlers/pdf.py +68 -0
- edsl/scenarios/handlers/png.py +39 -0
- edsl/scenarios/handlers/pptx.py +105 -0
- edsl/scenarios/handlers/py.py +294 -0
- edsl/scenarios/handlers/sql.py +313 -0
- edsl/scenarios/handlers/sqlite.py +149 -0
- edsl/scenarios/handlers/txt.py +33 -0
- edsl/scenarios/{ScenarioJoin.py → scenario_join.py} +131 -127
- edsl/scenarios/scenario_selector.py +156 -0
- edsl/shared.py +1 -1
- edsl/study/ObjectEntry.py +173 -173
- edsl/study/ProofOfWork.py +113 -113
- edsl/study/SnapShot.py +80 -80
- edsl/study/Study.py +521 -528
- edsl/study/__init__.py +4 -4
- edsl/surveys/ConstructDAG.py +92 -0
- edsl/surveys/DAG.py +148 -148
- edsl/surveys/EditSurvey.py +221 -0
- edsl/surveys/InstructionHandler.py +100 -0
- edsl/surveys/Memory.py +31 -31
- edsl/surveys/MemoryManagement.py +72 -0
- edsl/surveys/MemoryPlan.py +244 -244
- edsl/surveys/Rule.py +327 -326
- edsl/surveys/RuleCollection.py +385 -387
- edsl/surveys/RuleManager.py +172 -0
- edsl/surveys/Simulator.py +75 -0
- edsl/surveys/Survey.py +1280 -1801
- edsl/surveys/SurveyCSS.py +273 -261
- edsl/surveys/SurveyExportMixin.py +259 -259
- edsl/surveys/{SurveyFlowVisualizationMixin.py → SurveyFlowVisualization.py} +181 -179
- edsl/surveys/SurveyQualtricsImport.py +284 -284
- edsl/surveys/SurveyToApp.py +141 -0
- edsl/surveys/__init__.py +5 -3
- edsl/surveys/base.py +53 -53
- edsl/surveys/descriptors.py +60 -56
- edsl/surveys/instructions/ChangeInstruction.py +48 -49
- edsl/surveys/instructions/Instruction.py +56 -65
- edsl/surveys/instructions/InstructionCollection.py +82 -77
- edsl/templates/error_reporting/base.html +23 -23
- edsl/templates/error_reporting/exceptions_by_model.html +34 -34
- edsl/templates/error_reporting/exceptions_by_question_name.html +16 -16
- edsl/templates/error_reporting/exceptions_by_type.html +16 -16
- edsl/templates/error_reporting/interview_details.html +115 -115
- edsl/templates/error_reporting/interviews.html +19 -19
- edsl/templates/error_reporting/overview.html +4 -4
- edsl/templates/error_reporting/performance_plot.html +1 -1
- edsl/templates/error_reporting/report.css +73 -73
- edsl/templates/error_reporting/report.html +117 -117
- edsl/templates/error_reporting/report.js +25 -25
- edsl/test_h +1 -0
- edsl/tools/__init__.py +1 -1
- edsl/tools/clusters.py +192 -192
- edsl/tools/embeddings.py +27 -27
- edsl/tools/embeddings_plotting.py +118 -118
- edsl/tools/plotting.py +112 -112
- edsl/tools/summarize.py +18 -18
- edsl/utilities/PrettyList.py +56 -0
- edsl/utilities/SystemInfo.py +28 -28
- edsl/utilities/__init__.py +22 -22
- edsl/utilities/ast_utilities.py +25 -25
- edsl/utilities/data/Registry.py +6 -6
- edsl/utilities/data/__init__.py +1 -1
- edsl/utilities/data/scooter_results.json +1 -1
- edsl/utilities/decorators.py +77 -77
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -96
- edsl/utilities/gcp_bucket/example.py +50 -0
- edsl/utilities/interface.py +627 -627
- edsl/utilities/is_notebook.py +18 -0
- edsl/utilities/is_valid_variable_name.py +11 -0
- edsl/utilities/naming_utilities.py +263 -263
- edsl/utilities/remove_edsl_version.py +24 -0
- edsl/utilities/repair_functions.py +28 -28
- edsl/utilities/restricted_python.py +70 -70
- edsl/utilities/utilities.py +436 -424
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev4.dist-info}/LICENSE +21 -21
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev4.dist-info}/METADATA +13 -11
- edsl-0.1.39.dev4.dist-info/RECORD +361 -0
- edsl/language_models/KeyLookup.py +0 -30
- edsl/language_models/registry.py +0 -190
- edsl/language_models/unused/ReplicateBase.py +0 -83
- edsl/results/ResultsDBMixin.py +0 -238
- edsl-0.1.39.dev3.dist-info/RECORD +0 -277
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev4.dist-info}/WHEEL +0 -0
edsl/auto/StagePersona.py
CHANGED
@@ -1,61 +1,61 @@
|
|
1
|
-
from textwrap import dedent
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import List
|
4
|
-
|
5
|
-
from edsl.auto.StageBase import StageBase
|
6
|
-
from edsl.auto.StageBase import FlowDataBase
|
7
|
-
from edsl import Model
|
8
|
-
from edsl.auto.StageQuestions import StageQuestions
|
9
|
-
|
10
|
-
from edsl.questions import QuestionFreeText
|
11
|
-
from edsl.scenarios import Scenario
|
12
|
-
|
13
|
-
from edsl.auto.utilities import gen_pipeline
|
14
|
-
|
15
|
-
|
16
|
-
class StagePersona(StageBase):
|
17
|
-
input = StageQuestions.output
|
18
|
-
|
19
|
-
@dataclass
|
20
|
-
class Output(FlowDataBase):
|
21
|
-
persona: str
|
22
|
-
questions: List[str]
|
23
|
-
|
24
|
-
output = Output
|
25
|
-
|
26
|
-
def handle_data(self, data):
|
27
|
-
m = Model()
|
28
|
-
q_persona = QuestionFreeText(
|
29
|
-
question_text=dedent(
|
30
|
-
"""\
|
31
|
-
Imagine a person from the population {{ population }} responding to these questions: "{{ questions }}"
|
32
|
-
Make up a 1 paragraph persona for this person who would have answers for these questions.
|
33
|
-
"""
|
34
|
-
),
|
35
|
-
question_name="persona",
|
36
|
-
)
|
37
|
-
results = (
|
38
|
-
q_persona.by(m)
|
39
|
-
.by(Scenario({"questions": data.questions, "population": data.population}))
|
40
|
-
.run()
|
41
|
-
)
|
42
|
-
print("Constructing a persona that could answer the following questions:")
|
43
|
-
print(data.questions)
|
44
|
-
results.select("persona").print(
|
45
|
-
pretty_labels={
|
46
|
-
"answer.persona": f"Persona that can answer: {data.questions}"
|
47
|
-
},
|
48
|
-
split_at_dot=False,
|
49
|
-
)
|
50
|
-
persona = results.select("persona").first()
|
51
|
-
return self.output(persona=persona, questions=data.questions)
|
52
|
-
|
53
|
-
|
54
|
-
if __name__ == "__main__":
|
55
|
-
pipeline = gen_pipeline([StageQuestions, StagePersona])
|
56
|
-
pipeline.process(
|
57
|
-
pipeline.input(
|
58
|
-
overall_question="What are some factors that could determine whether someone likes ice cream?",
|
59
|
-
persona="People",
|
60
|
-
)
|
61
|
-
)
|
1
|
+
from textwrap import dedent
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import List
|
4
|
+
|
5
|
+
from edsl.auto.StageBase import StageBase
|
6
|
+
from edsl.auto.StageBase import FlowDataBase
|
7
|
+
from edsl import Model
|
8
|
+
from edsl.auto.StageQuestions import StageQuestions
|
9
|
+
|
10
|
+
from edsl.questions import QuestionFreeText
|
11
|
+
from edsl.scenarios import Scenario
|
12
|
+
|
13
|
+
from edsl.auto.utilities import gen_pipeline
|
14
|
+
|
15
|
+
|
16
|
+
class StagePersona(StageBase):
|
17
|
+
input = StageQuestions.output
|
18
|
+
|
19
|
+
@dataclass
|
20
|
+
class Output(FlowDataBase):
|
21
|
+
persona: str
|
22
|
+
questions: List[str]
|
23
|
+
|
24
|
+
output = Output
|
25
|
+
|
26
|
+
def handle_data(self, data):
|
27
|
+
m = Model()
|
28
|
+
q_persona = QuestionFreeText(
|
29
|
+
question_text=dedent(
|
30
|
+
"""\
|
31
|
+
Imagine a person from the population {{ population }} responding to these questions: "{{ questions }}"
|
32
|
+
Make up a 1 paragraph persona for this person who would have answers for these questions.
|
33
|
+
"""
|
34
|
+
),
|
35
|
+
question_name="persona",
|
36
|
+
)
|
37
|
+
results = (
|
38
|
+
q_persona.by(m)
|
39
|
+
.by(Scenario({"questions": data.questions, "population": data.population}))
|
40
|
+
.run()
|
41
|
+
)
|
42
|
+
print("Constructing a persona that could answer the following questions:")
|
43
|
+
print(data.questions)
|
44
|
+
results.select("persona").print(
|
45
|
+
pretty_labels={
|
46
|
+
"answer.persona": f"Persona that can answer: {data.questions}"
|
47
|
+
},
|
48
|
+
split_at_dot=False,
|
49
|
+
)
|
50
|
+
persona = results.select("persona").first()
|
51
|
+
return self.output(persona=persona, questions=data.questions)
|
52
|
+
|
53
|
+
|
54
|
+
if __name__ == "__main__":
|
55
|
+
pipeline = gen_pipeline([StageQuestions, StagePersona])
|
56
|
+
pipeline.process(
|
57
|
+
pipeline.input(
|
58
|
+
overall_question="What are some factors that could determine whether someone likes ice cream?",
|
59
|
+
persona="People",
|
60
|
+
)
|
61
|
+
)
|
@@ -1,88 +1,88 @@
|
|
1
|
-
from textwrap import dedent
|
2
|
-
from dataclasses import dataclass
|
3
|
-
|
4
|
-
from typing import List
|
5
|
-
|
6
|
-
from edsl.auto.StageBase import StageBase
|
7
|
-
from edsl.auto.StageBase import FlowDataBase
|
8
|
-
|
9
|
-
from edsl.auto.StagePersonaDimensionValues import StagePersonaDimensionValues
|
10
|
-
|
11
|
-
from edsl.questions import QuestionList
|
12
|
-
from edsl.scenarios import Scenario
|
13
|
-
from edsl import Model
|
14
|
-
from edsl.auto.utilities import gen_pipeline
|
15
|
-
|
16
|
-
|
17
|
-
class StagePersonaDimensionValueRanges(StageBase):
|
18
|
-
input = StagePersonaDimensionValues.output
|
19
|
-
|
20
|
-
@dataclass
|
21
|
-
class Output(FlowDataBase):
|
22
|
-
focal_dimension_values: List[dict]
|
23
|
-
mapping: dict
|
24
|
-
persona: str
|
25
|
-
|
26
|
-
output = Output
|
27
|
-
|
28
|
-
def handle_data(self, data):
|
29
|
-
# breakpoint()
|
30
|
-
"""Goal with this stage is to, for each dimension, get a range of values that the persona might have for that dimension."""
|
31
|
-
dimension_values = data["dimension_values"]
|
32
|
-
attribute_results = data["attribute_results"]
|
33
|
-
persona = data["persona"]
|
34
|
-
m = Model()
|
35
|
-
d = dict(zip(attribute_results, dimension_values))
|
36
|
-
q = QuestionList(
|
37
|
-
question_text=dedent(
|
38
|
-
"""\
|
39
|
-
Consider the following persona: {{ persona }}.
|
40
|
-
They were categorized as having the following attributes: {{ d }}.
|
41
|
-
For this dimension: {{ focal_dimension }},
|
42
|
-
What are values that other people might have on this attribute?
|
43
|
-
"""
|
44
|
-
),
|
45
|
-
question_name="focal_dimension_values",
|
46
|
-
)
|
47
|
-
s = [
|
48
|
-
Scenario({"persona": persona, "d": d, "focal_dimension": k})
|
49
|
-
for k in d.keys()
|
50
|
-
]
|
51
|
-
results = q.by(s).by(m).run()
|
52
|
-
# breakpoint()
|
53
|
-
results.select("focal_dimension", "answer.*").print(
|
54
|
-
pretty_labels={
|
55
|
-
"scenario.focal_dimension": f"Dimensions of a persona",
|
56
|
-
"answer.focal_dimension_values": f"Values a person might have for that dimension",
|
57
|
-
},
|
58
|
-
split_at_dot=False,
|
59
|
-
)
|
60
|
-
|
61
|
-
focal_dimension_values = results.select("focal_dimension_values").to_list()
|
62
|
-
mapping = dict(zip(attribute_results, focal_dimension_values))
|
63
|
-
return self.output(
|
64
|
-
focal_dimension_values=focal_dimension_values,
|
65
|
-
mapping=mapping,
|
66
|
-
persona=persona,
|
67
|
-
)
|
68
|
-
|
69
|
-
|
70
|
-
if __name__ == "__main__":
|
71
|
-
from edsl.auto.StageQuestions import StageQuestions
|
72
|
-
from edsl.auto.StagePersona import StagePersona
|
73
|
-
from edsl.auto.StagePersonaDimensions import StagePersonaDimensions
|
74
|
-
|
75
|
-
pipeline = gen_pipeline(
|
76
|
-
[
|
77
|
-
StageQuestions,
|
78
|
-
StagePersona,
|
79
|
-
StagePersonaDimensions,
|
80
|
-
StagePersonaDimensionValues,
|
81
|
-
StagePersonaDimensionValueRanges,
|
82
|
-
]
|
83
|
-
)
|
84
|
-
pipeline.process(
|
85
|
-
pipeline.input(
|
86
|
-
overall_question="What are some factors that could determine whether someone likes ice cream?"
|
87
|
-
)
|
88
|
-
)
|
1
|
+
from textwrap import dedent
|
2
|
+
from dataclasses import dataclass
|
3
|
+
|
4
|
+
from typing import List
|
5
|
+
|
6
|
+
from edsl.auto.StageBase import StageBase
|
7
|
+
from edsl.auto.StageBase import FlowDataBase
|
8
|
+
|
9
|
+
from edsl.auto.StagePersonaDimensionValues import StagePersonaDimensionValues
|
10
|
+
|
11
|
+
from edsl.questions import QuestionList
|
12
|
+
from edsl.scenarios import Scenario
|
13
|
+
from edsl import Model
|
14
|
+
from edsl.auto.utilities import gen_pipeline
|
15
|
+
|
16
|
+
|
17
|
+
class StagePersonaDimensionValueRanges(StageBase):
|
18
|
+
input = StagePersonaDimensionValues.output
|
19
|
+
|
20
|
+
@dataclass
|
21
|
+
class Output(FlowDataBase):
|
22
|
+
focal_dimension_values: List[dict]
|
23
|
+
mapping: dict
|
24
|
+
persona: str
|
25
|
+
|
26
|
+
output = Output
|
27
|
+
|
28
|
+
def handle_data(self, data):
|
29
|
+
# breakpoint()
|
30
|
+
"""Goal with this stage is to, for each dimension, get a range of values that the persona might have for that dimension."""
|
31
|
+
dimension_values = data["dimension_values"]
|
32
|
+
attribute_results = data["attribute_results"]
|
33
|
+
persona = data["persona"]
|
34
|
+
m = Model()
|
35
|
+
d = dict(zip(attribute_results, dimension_values))
|
36
|
+
q = QuestionList(
|
37
|
+
question_text=dedent(
|
38
|
+
"""\
|
39
|
+
Consider the following persona: {{ persona }}.
|
40
|
+
They were categorized as having the following attributes: {{ d }}.
|
41
|
+
For this dimension: {{ focal_dimension }},
|
42
|
+
What are values that other people might have on this attribute?
|
43
|
+
"""
|
44
|
+
),
|
45
|
+
question_name="focal_dimension_values",
|
46
|
+
)
|
47
|
+
s = [
|
48
|
+
Scenario({"persona": persona, "d": d, "focal_dimension": k})
|
49
|
+
for k in d.keys()
|
50
|
+
]
|
51
|
+
results = q.by(s).by(m).run()
|
52
|
+
# breakpoint()
|
53
|
+
results.select("focal_dimension", "answer.*").print(
|
54
|
+
pretty_labels={
|
55
|
+
"scenario.focal_dimension": f"Dimensions of a persona",
|
56
|
+
"answer.focal_dimension_values": f"Values a person might have for that dimension",
|
57
|
+
},
|
58
|
+
split_at_dot=False,
|
59
|
+
)
|
60
|
+
|
61
|
+
focal_dimension_values = results.select("focal_dimension_values").to_list()
|
62
|
+
mapping = dict(zip(attribute_results, focal_dimension_values))
|
63
|
+
return self.output(
|
64
|
+
focal_dimension_values=focal_dimension_values,
|
65
|
+
mapping=mapping,
|
66
|
+
persona=persona,
|
67
|
+
)
|
68
|
+
|
69
|
+
|
70
|
+
if __name__ == "__main__":
|
71
|
+
from edsl.auto.StageQuestions import StageQuestions
|
72
|
+
from edsl.auto.StagePersona import StagePersona
|
73
|
+
from edsl.auto.StagePersonaDimensions import StagePersonaDimensions
|
74
|
+
|
75
|
+
pipeline = gen_pipeline(
|
76
|
+
[
|
77
|
+
StageQuestions,
|
78
|
+
StagePersona,
|
79
|
+
StagePersonaDimensions,
|
80
|
+
StagePersonaDimensionValues,
|
81
|
+
StagePersonaDimensionValueRanges,
|
82
|
+
]
|
83
|
+
)
|
84
|
+
pipeline.process(
|
85
|
+
pipeline.input(
|
86
|
+
overall_question="What are some factors that could determine whether someone likes ice cream?"
|
87
|
+
)
|
88
|
+
)
|
@@ -1,74 +1,74 @@
|
|
1
|
-
from textwrap import dedent
|
2
|
-
from dataclasses import dataclass
|
3
|
-
|
4
|
-
from typing import List, Dict
|
5
|
-
|
6
|
-
from edsl.auto.StageBase import StageBase
|
7
|
-
from edsl.auto.StageBase import FlowDataBase
|
8
|
-
|
9
|
-
from edsl.auto.StagePersonaDimensions import StagePersonaDimensions
|
10
|
-
from edsl import Model
|
11
|
-
from edsl.questions import QuestionList, QuestionExtract
|
12
|
-
from edsl.scenarios import Scenario
|
13
|
-
|
14
|
-
from edsl.auto.utilities import gen_pipeline
|
15
|
-
|
16
|
-
|
17
|
-
class StagePersonaDimensionValues(StageBase):
|
18
|
-
input = StagePersonaDimensions.output
|
19
|
-
|
20
|
-
@dataclass
|
21
|
-
class Output(FlowDataBase):
|
22
|
-
attribute_results: List[str]
|
23
|
-
dimension_values: Dict[str, str]
|
24
|
-
persona: str
|
25
|
-
|
26
|
-
output = Output
|
27
|
-
|
28
|
-
def handle_data(self, data):
|
29
|
-
attribute_results = data.attribute_results
|
30
|
-
persona = data.persona
|
31
|
-
m = Model()
|
32
|
-
q = QuestionExtract(
|
33
|
-
question_text=dedent(
|
34
|
-
"""\
|
35
|
-
This is a persona: "{{ persona }}"
|
36
|
-
They vary on the following dimensions: "{{ attribute_results }}"
|
37
|
-
For each dimenion, what are some values that this persona might have for that dimension?
|
38
|
-
Please keep answers very short, ideally one word.
|
39
|
-
"""
|
40
|
-
),
|
41
|
-
answer_template={k: None for k in attribute_results},
|
42
|
-
question_name="dimension_values",
|
43
|
-
)
|
44
|
-
results = (
|
45
|
-
q.by(Scenario({"attribute_results": attribute_results, "persona": persona}))
|
46
|
-
.by(m)
|
47
|
-
.run()
|
48
|
-
)
|
49
|
-
results.select("attribute_results", "dimension_values").print()
|
50
|
-
return self.output(
|
51
|
-
dimension_values=results.select("dimension_values").first(),
|
52
|
-
attribute_results=attribute_results,
|
53
|
-
persona=persona,
|
54
|
-
)
|
55
|
-
|
56
|
-
|
57
|
-
if __name__ == "__main__":
|
58
|
-
from edsl.auto.StageQuestions import StageQuestions
|
59
|
-
from edsl.auto.StagePersona import StagePersona
|
60
|
-
from edsl.auto.StagePersonaDimensions import StagePersonaDimensions
|
61
|
-
|
62
|
-
pipeline = gen_pipeline(
|
63
|
-
[
|
64
|
-
StageQuestions,
|
65
|
-
StagePersona,
|
66
|
-
StagePersonaDimensions,
|
67
|
-
StagePersonaDimensionValues,
|
68
|
-
]
|
69
|
-
)
|
70
|
-
pipeline.process(
|
71
|
-
pipeline.input(
|
72
|
-
overall_question="What are some factors that could determine whether someone likes ice cream?"
|
73
|
-
)
|
74
|
-
)
|
1
|
+
from textwrap import dedent
|
2
|
+
from dataclasses import dataclass
|
3
|
+
|
4
|
+
from typing import List, Dict
|
5
|
+
|
6
|
+
from edsl.auto.StageBase import StageBase
|
7
|
+
from edsl.auto.StageBase import FlowDataBase
|
8
|
+
|
9
|
+
from edsl.auto.StagePersonaDimensions import StagePersonaDimensions
|
10
|
+
from edsl import Model
|
11
|
+
from edsl.questions import QuestionList, QuestionExtract
|
12
|
+
from edsl.scenarios import Scenario
|
13
|
+
|
14
|
+
from edsl.auto.utilities import gen_pipeline
|
15
|
+
|
16
|
+
|
17
|
+
class StagePersonaDimensionValues(StageBase):
|
18
|
+
input = StagePersonaDimensions.output
|
19
|
+
|
20
|
+
@dataclass
|
21
|
+
class Output(FlowDataBase):
|
22
|
+
attribute_results: List[str]
|
23
|
+
dimension_values: Dict[str, str]
|
24
|
+
persona: str
|
25
|
+
|
26
|
+
output = Output
|
27
|
+
|
28
|
+
def handle_data(self, data):
|
29
|
+
attribute_results = data.attribute_results
|
30
|
+
persona = data.persona
|
31
|
+
m = Model()
|
32
|
+
q = QuestionExtract(
|
33
|
+
question_text=dedent(
|
34
|
+
"""\
|
35
|
+
This is a persona: "{{ persona }}"
|
36
|
+
They vary on the following dimensions: "{{ attribute_results }}"
|
37
|
+
For each dimenion, what are some values that this persona might have for that dimension?
|
38
|
+
Please keep answers very short, ideally one word.
|
39
|
+
"""
|
40
|
+
),
|
41
|
+
answer_template={k: None for k in attribute_results},
|
42
|
+
question_name="dimension_values",
|
43
|
+
)
|
44
|
+
results = (
|
45
|
+
q.by(Scenario({"attribute_results": attribute_results, "persona": persona}))
|
46
|
+
.by(m)
|
47
|
+
.run()
|
48
|
+
)
|
49
|
+
results.select("attribute_results", "dimension_values").print()
|
50
|
+
return self.output(
|
51
|
+
dimension_values=results.select("dimension_values").first(),
|
52
|
+
attribute_results=attribute_results,
|
53
|
+
persona=persona,
|
54
|
+
)
|
55
|
+
|
56
|
+
|
57
|
+
if __name__ == "__main__":
|
58
|
+
from edsl.auto.StageQuestions import StageQuestions
|
59
|
+
from edsl.auto.StagePersona import StagePersona
|
60
|
+
from edsl.auto.StagePersonaDimensions import StagePersonaDimensions
|
61
|
+
|
62
|
+
pipeline = gen_pipeline(
|
63
|
+
[
|
64
|
+
StageQuestions,
|
65
|
+
StagePersona,
|
66
|
+
StagePersonaDimensions,
|
67
|
+
StagePersonaDimensionValues,
|
68
|
+
]
|
69
|
+
)
|
70
|
+
pipeline.process(
|
71
|
+
pipeline.input(
|
72
|
+
overall_question="What are some factors that could determine whether someone likes ice cream?"
|
73
|
+
)
|
74
|
+
)
|
@@ -1,69 +1,69 @@
|
|
1
|
-
from textwrap import dedent
|
2
|
-
from dataclasses import dataclass
|
3
|
-
|
4
|
-
from typing import List
|
5
|
-
|
6
|
-
from edsl.auto.StageBase import StageBase
|
7
|
-
from edsl.auto.StageBase import FlowDataBase
|
8
|
-
|
9
|
-
from edsl.auto.StagePersona import StagePersona
|
10
|
-
|
11
|
-
from edsl.questions import QuestionList
|
12
|
-
from edsl.scenarios import Scenario
|
13
|
-
from edsl import Model
|
14
|
-
|
15
|
-
from edsl.auto.utilities import gen_pipeline
|
16
|
-
|
17
|
-
|
18
|
-
class StagePersonaDimensions(StageBase):
|
19
|
-
input = StagePersona.output
|
20
|
-
|
21
|
-
@dataclass
|
22
|
-
class Output(FlowDataBase):
|
23
|
-
attribute_results: List[str]
|
24
|
-
persona: str
|
25
|
-
|
26
|
-
output = Output
|
27
|
-
|
28
|
-
def handle_data(self, data):
|
29
|
-
q_attributes = QuestionList(
|
30
|
-
question_text=dedent(
|
31
|
-
"""\
|
32
|
-
Here is a persona: "{{ persona }}"
|
33
|
-
It was construced to be someone who could answer these questions: "{{ questions }}"
|
34
|
-
|
35
|
-
We want to identify the general dimensions that make up this persona.
|
36
|
-
E.g., if the person is desribed as 'happy' then a dimenion would be 'mood'
|
37
|
-
"""
|
38
|
-
),
|
39
|
-
question_name="find_attributes",
|
40
|
-
)
|
41
|
-
m = Model()
|
42
|
-
results = (
|
43
|
-
q_attributes.by(
|
44
|
-
Scenario({"persona": data.persona, "questions": data.questions})
|
45
|
-
)
|
46
|
-
.by(m)
|
47
|
-
.run()
|
48
|
-
)
|
49
|
-
(
|
50
|
-
results.select("find_attributes").print(
|
51
|
-
pretty_labels={
|
52
|
-
"answer.find_attributes": f'Persona dimensions for: "{data.persona}"'
|
53
|
-
},
|
54
|
-
split_at_dot=False,
|
55
|
-
)
|
56
|
-
)
|
57
|
-
attribute_results = results.select("find_attributes").first()
|
58
|
-
return self.output(attribute_results=attribute_results, persona=data.persona)
|
59
|
-
|
60
|
-
|
61
|
-
if __name__ == "__main__":
|
62
|
-
from edsl.auto.StageQuestions import StageQuestions
|
63
|
-
|
64
|
-
pipeline = gen_pipeline([StageQuestions, StagePersona, StagePersonaDimensions])
|
65
|
-
pipeline.process(
|
66
|
-
pipeline.input(
|
67
|
-
overall_question="What are some factors that could determine whether someone likes ice cream?"
|
68
|
-
)
|
69
|
-
)
|
1
|
+
from textwrap import dedent
|
2
|
+
from dataclasses import dataclass
|
3
|
+
|
4
|
+
from typing import List
|
5
|
+
|
6
|
+
from edsl.auto.StageBase import StageBase
|
7
|
+
from edsl.auto.StageBase import FlowDataBase
|
8
|
+
|
9
|
+
from edsl.auto.StagePersona import StagePersona
|
10
|
+
|
11
|
+
from edsl.questions import QuestionList
|
12
|
+
from edsl.scenarios import Scenario
|
13
|
+
from edsl import Model
|
14
|
+
|
15
|
+
from edsl.auto.utilities import gen_pipeline
|
16
|
+
|
17
|
+
|
18
|
+
class StagePersonaDimensions(StageBase):
|
19
|
+
input = StagePersona.output
|
20
|
+
|
21
|
+
@dataclass
|
22
|
+
class Output(FlowDataBase):
|
23
|
+
attribute_results: List[str]
|
24
|
+
persona: str
|
25
|
+
|
26
|
+
output = Output
|
27
|
+
|
28
|
+
def handle_data(self, data):
|
29
|
+
q_attributes = QuestionList(
|
30
|
+
question_text=dedent(
|
31
|
+
"""\
|
32
|
+
Here is a persona: "{{ persona }}"
|
33
|
+
It was construced to be someone who could answer these questions: "{{ questions }}"
|
34
|
+
|
35
|
+
We want to identify the general dimensions that make up this persona.
|
36
|
+
E.g., if the person is desribed as 'happy' then a dimenion would be 'mood'
|
37
|
+
"""
|
38
|
+
),
|
39
|
+
question_name="find_attributes",
|
40
|
+
)
|
41
|
+
m = Model()
|
42
|
+
results = (
|
43
|
+
q_attributes.by(
|
44
|
+
Scenario({"persona": data.persona, "questions": data.questions})
|
45
|
+
)
|
46
|
+
.by(m)
|
47
|
+
.run()
|
48
|
+
)
|
49
|
+
(
|
50
|
+
results.select("find_attributes").print(
|
51
|
+
pretty_labels={
|
52
|
+
"answer.find_attributes": f'Persona dimensions for: "{data.persona}"'
|
53
|
+
},
|
54
|
+
split_at_dot=False,
|
55
|
+
)
|
56
|
+
)
|
57
|
+
attribute_results = results.select("find_attributes").first()
|
58
|
+
return self.output(attribute_results=attribute_results, persona=data.persona)
|
59
|
+
|
60
|
+
|
61
|
+
if __name__ == "__main__":
|
62
|
+
from edsl.auto.StageQuestions import StageQuestions
|
63
|
+
|
64
|
+
pipeline = gen_pipeline([StageQuestions, StagePersona, StagePersonaDimensions])
|
65
|
+
pipeline.process(
|
66
|
+
pipeline.input(
|
67
|
+
overall_question="What are some factors that could determine whether someone likes ice cream?"
|
68
|
+
)
|
69
|
+
)
|