From 5c05f2088b942ac758b13bb03ff765270cc86c05 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 9 Jul 2023 01:26:09 +0800 Subject: [PATCH] rename files --- .../auto_dataframe.py | 0 .../auto_multi_dataframe.py | 0 .../citation_fuzzy_match.py | 0 .../diagram.py | 0 .../schema.png | Bin .../citation_fuzzy_match.py | 134 ------------------ .../citation_with_fuzzy_matching/diagram.py | 6 - .../citation_with_fuzzy_matching/schema.png | Bin 17457 -> 0 bytes .../diagram.py | 0 .../schema.png | Bin .../segment_search_queries.py | 0 .../diagram.py | 0 .../parse_recursive_paths.py | 0 .../schema.png | Bin .../diagram.py | 0 .../safe_sql.py | 0 .../schema.png | Bin .../diagram.py | 0 .../schema.png | Bin .../task_planner_topological_sort.py | 0 20 files changed, 140 deletions(-) rename examples/{auto_dataframe => automatic_dataframe_extraction}/auto_dataframe.py (100%) rename examples/{auto_dataframe => automatic_dataframe_extraction}/auto_multi_dataframe.py (100%) rename examples/{citation_fuzzy_match => citation_with_extraction}/citation_fuzzy_match.py (100%) rename examples/{citation_fuzzy_match => citation_with_extraction}/diagram.py (100%) rename examples/{citation_fuzzy_match => citation_with_extraction}/schema.png (100%) delete mode 100644 examples/citation_with_fuzzy_matching/citation_fuzzy_match.py delete mode 100644 examples/citation_with_fuzzy_matching/diagram.py delete mode 100644 examples/citation_with_fuzzy_matching/schema.png rename examples/{segment_search_queries => multiple_search_queries}/diagram.py (100%) rename examples/{segment_search_queries => multiple_search_queries}/schema.png (100%) rename examples/{segment_search_queries => multiple_search_queries}/segment_search_queries.py (100%) rename examples/{parse_recursive_paths => recursive_filepaths}/diagram.py (100%) rename examples/{parse_recursive_paths => recursive_filepaths}/parse_recursive_paths.py (100%) rename examples/{parse_recursive_paths => recursive_filepaths}/schema.png (100%) rename examples/{safe_sql => safer_sql_example}/diagram.py (100%) rename examples/{safe_sql => safer_sql_example}/safe_sql.py (100%) rename examples/{safe_sql => safer_sql_example}/schema.png (100%) rename examples/{task_planner_topological_sort => task_planner}/diagram.py (100%) rename examples/{task_planner_topological_sort => task_planner}/schema.png (100%) rename examples/{task_planner_topological_sort => task_planner}/task_planner_topological_sort.py (100%) diff --git a/examples/auto_dataframe/auto_dataframe.py b/examples/automatic_dataframe_extraction/auto_dataframe.py similarity index 100% rename from examples/auto_dataframe/auto_dataframe.py rename to examples/automatic_dataframe_extraction/auto_dataframe.py diff --git a/examples/auto_dataframe/auto_multi_dataframe.py b/examples/automatic_dataframe_extraction/auto_multi_dataframe.py similarity index 100% rename from examples/auto_dataframe/auto_multi_dataframe.py rename to examples/automatic_dataframe_extraction/auto_multi_dataframe.py diff --git a/examples/citation_fuzzy_match/citation_fuzzy_match.py b/examples/citation_with_extraction/citation_fuzzy_match.py similarity index 100% rename from examples/citation_fuzzy_match/citation_fuzzy_match.py rename to examples/citation_with_extraction/citation_fuzzy_match.py diff --git a/examples/citation_fuzzy_match/diagram.py b/examples/citation_with_extraction/diagram.py similarity index 100% rename from examples/citation_fuzzy_match/diagram.py rename to examples/citation_with_extraction/diagram.py diff --git a/examples/citation_fuzzy_match/schema.png b/examples/citation_with_extraction/schema.png similarity index 100% rename from examples/citation_fuzzy_match/schema.png rename to examples/citation_with_extraction/schema.png diff --git a/examples/citation_with_fuzzy_matching/citation_fuzzy_match.py b/examples/citation_with_fuzzy_matching/citation_fuzzy_match.py deleted file mode 100644 index 69f8c82..0000000 --- a/examples/citation_with_fuzzy_matching/citation_fuzzy_match.py +++ /dev/null @@ -1,134 +0,0 @@ -from typing import List - -import openai -from pydantic import Field, BaseModel - -from openai_function_call import OpenAISchema - - -class Fact(BaseModel): - """ - Class representing single statement. - Each fact has a body and a list of sources. - If there are multiple facts make sure to break them apart such that each one only uses a set of sources that are relevant to it. - """ - - fact: str = Field(..., description="Body of the sentence, as part of a response") - substring_quote: List[str] = Field( - ..., - description="Each source should be a direct quote from the context, as a substring of the original content", - ) - - def _get_span(self, quote, context, errs=100): - import regex - - minor = quote - major = context - - errs_ = 0 - s = regex.search(f"({minor}){{e<={errs_}}}", major) - while s is None and errs_ <= errs: - errs_ += 1 - s = regex.search(f"({minor}){{e<={errs_}}}", major) - - if s is not None: - yield from s.spans() - - def get_spans(self, context): - for quote in self.substring_quote: - yield from self._get_span(quote, context) - - -class QuestionAnswer(OpenAISchema): - """ - Class representing a question and its answer as a list of facts each one should have a soruce. - each sentence contains a body and a list of sources.""" - - question: str = Field(..., description="Question that was asked") - answer: List[Fact] = Field( - ..., - description="Body of the answer, each fact should be its seperate object with a body and a list of sources", - ) - - -def ask_ai(question: str, context: str) -> QuestionAnswer: - """ - Function to ask AI a question and get back an Answer object. - but should be updated to use the actual method for making a request to the AI. - - Args: - question (str): The question to ask the AI. - context (str): The context for the question. - - Returns: - Answer: The Answer object. - """ - - # Making a request to the hypothetical 'openai' module - completion = openai.ChatCompletion.create( - model="gpt-3.5-turbo-0613", - temperature=0.2, - max_tokens=1000, - functions=[QuestionAnswer.openai_schema], - function_call={"name": QuestionAnswer.openai_schema["name"]}, - messages=[ - { - "role": "system", - "content": f"You are a world class algorithm to answer questions with correct and exact citations. ", - }, - {"role": "user", "content": f"Answer question using the following context"}, - {"role": "user", "content": f"{context}"}, - {"role": "user", "content": f"Question: {question}"}, - { - "role": "user", - "content": f"Tips: Make sure to cite your sources, and use the exact words from the context.", - }, - ], - ) - - # Creating an Answer object from the completion response - return QuestionAnswer.from_response(completion) - - -question = "What did the author do during college?" -context = """ -My name is Jason Liu, and I grew up in Toronto Canada but I was born in China. -I went to an arts highschool but in university I studied Computational Mathematics and physics. -As part of coop I worked at many companies including Stitchfix, Facebook. -I also started the Data Science club at the University of Waterloo and I was the president of the club for 2 years. -""" - - -def highlight(text, span): - return ( - "..." - + text[span[0] - 50 : span[0]].replace("\n", "") - + "\033[91m" - + "<" - + text[span[0] : span[1]].replace("\n", "") - + "> " - + "\033[0m" - + text[span[1] : span[1] + 20].replace("\n", "") - + "..." - ) - - -answer = ask_ai(question, context) - -print("Question:", question) -print() -for fact in answer.answer: - print("Statement:", fact.fact) - for span in fact.get_spans(context): - print("Citation:", highlight(context, span)) - print() - """ - Question: What did the author do during college? - - Statement: The author studied Computational Mathematics and physics in university. - Citation: ...s born in China.I went to an arts highschool but . As part of coop I... - - Statement: The author started the Data Science club at the University of Waterloo and was the president of the club for 2 years. - Citation: ...y companies including Stitchfix, Facebook.I also and I was the presi... - Citation: ... club at the University of Waterloo and I was the ... - """ diff --git a/examples/citation_with_fuzzy_matching/diagram.py b/examples/citation_with_fuzzy_matching/diagram.py deleted file mode 100644 index 87ed23c..0000000 --- a/examples/citation_with_fuzzy_matching/diagram.py +++ /dev/null @@ -1,6 +0,0 @@ -import erdantic as erd - -from citation_fuzzy_match import QuestionAnswer - -diagram = erd.create(QuestionAnswer) -diagram.draw("examples/citation_fuzzy_match/schema.png") diff --git a/examples/citation_with_fuzzy_matching/schema.png b/examples/citation_with_fuzzy_matching/schema.png deleted file mode 100644 index 66bd66c849eb35a6d5f97c8565fb806b5ed289a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17457 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 JQ-#wv{ul6P@cIA% diff --git a/examples/segment_search_queries/diagram.py b/examples/multiple_search_queries/diagram.py similarity index 100% rename from examples/segment_search_queries/diagram.py rename to examples/multiple_search_queries/diagram.py diff --git a/examples/segment_search_queries/schema.png b/examples/multiple_search_queries/schema.png similarity index 100% rename from examples/segment_search_queries/schema.png rename to examples/multiple_search_queries/schema.png diff --git a/examples/segment_search_queries/segment_search_queries.py b/examples/multiple_search_queries/segment_search_queries.py similarity index 100% rename from examples/segment_search_queries/segment_search_queries.py rename to examples/multiple_search_queries/segment_search_queries.py diff --git a/examples/parse_recursive_paths/diagram.py b/examples/recursive_filepaths/diagram.py similarity index 100% rename from examples/parse_recursive_paths/diagram.py rename to examples/recursive_filepaths/diagram.py diff --git a/examples/parse_recursive_paths/parse_recursive_paths.py b/examples/recursive_filepaths/parse_recursive_paths.py similarity index 100% rename from examples/parse_recursive_paths/parse_recursive_paths.py rename to examples/recursive_filepaths/parse_recursive_paths.py diff --git a/examples/parse_recursive_paths/schema.png b/examples/recursive_filepaths/schema.png similarity index 100% rename from examples/parse_recursive_paths/schema.png rename to examples/recursive_filepaths/schema.png diff --git a/examples/safe_sql/diagram.py b/examples/safer_sql_example/diagram.py similarity index 100% rename from examples/safe_sql/diagram.py rename to examples/safer_sql_example/diagram.py diff --git a/examples/safe_sql/safe_sql.py b/examples/safer_sql_example/safe_sql.py similarity index 100% rename from examples/safe_sql/safe_sql.py rename to examples/safer_sql_example/safe_sql.py diff --git a/examples/safe_sql/schema.png b/examples/safer_sql_example/schema.png similarity index 100% rename from examples/safe_sql/schema.png rename to examples/safer_sql_example/schema.png diff --git a/examples/task_planner_topological_sort/diagram.py b/examples/task_planner/diagram.py similarity index 100% rename from examples/task_planner_topological_sort/diagram.py rename to examples/task_planner/diagram.py diff --git a/examples/task_planner_topological_sort/schema.png b/examples/task_planner/schema.png similarity index 100% rename from examples/task_planner_topological_sort/schema.png rename to examples/task_planner/schema.png diff --git a/examples/task_planner_topological_sort/task_planner_topological_sort.py b/examples/task_planner/task_planner_topological_sort.py similarity index 100% rename from examples/task_planner_topological_sort/task_planner_topological_sort.py rename to examples/task_planner/task_planner_topological_sort.py