├── assets ├── teaser.png └── pipeline.png ├── requirement.txt ├── README.md ├── .gitignore ├── app └── gradio_app.py └── creative.ipynb /assets/teaser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/machinelearnear/RAT-bedrock/main/assets/teaser.png -------------------------------------------------------------------------------- /assets/pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/machinelearnear/RAT-bedrock/main/assets/pipeline.png -------------------------------------------------------------------------------- /requirement.txt: -------------------------------------------------------------------------------- 1 | gradio 2 | langchain 3 | tiktoken 4 | html2text 5 | IPython 6 | beautifulsoup4 7 | duckduckgo-search 8 | boto3 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Horizon Generation 2 | 3 |
4 | 5 | [[Website]](http://craftjarvis-jarvis.github.io/RAT) 6 | [[Paper]](https://arxiv.org/abs/2403.05313) 7 | [[Demo]](https://huggingface.co/spaces/jeasinema/RAT) 8 | 9 | ![](assets/pipeline.png) 10 | 11 |
12 | 13 | ## Abstract 14 | 15 | We explore how iterative revising a chain of thoughts with the help of information retrieval significantly improves large language models' reasoning and generation ability in long-horizon generation tasks, while hugely mitigating hallucination. In particular, the proposed method — retrieval-augmented thoughts (RAT) — revises each thought step one by one with retrieved information relevant to the task query, the current and the past thought steps, after the initial zero-shot CoT is generated. 16 | 17 | ## Prerequisites 18 | 19 | * Python packages can be installed with `pip install -r requirements.txt` 20 | 21 | * `OpenAI_API_key` is required for the language model. You can get it from [OpenAI](https://beta.openai.com/signup/). 22 | ``` 23 | export OPENAI_API_KEY="sk-******" 24 | ``` 25 | 26 | * You can also use the Huggingface API key for the language model. You can get it from [Huggingface](https://huggingface.co/join). 27 | 28 | * You also need to prepare the `GOOGLE_API_KEY` for Google Search API. You can get it from [Google Cloud Platform](https://cloud.google.com/docs/authentication/getting-started). 29 | ``` 30 | export GOOGLE_API_KEY="********" 31 | ``` 32 | 33 | 34 | 35 | 36 | ## Getting Started 37 | 38 | You can run the ipython notebook named `creative.ipynb` to generate open-ended creative text with RAT. 39 | 40 | You can also use the following code to start a Gradio interface to interact with RAT: 41 | 42 | ```shell 43 | python app/gradio_app.py 44 | ``` 45 | 46 | 47 | ## Experimental Results 48 | 49 | Applying RAT to various base models substantially improves their performances on various long-horizon generation tasks; on average of relatively increasing rating scores by 13.63% on code generation, 16.96% on mathematical reasoning, 19.2% on creative writing, and 42.78% on embodied task planning. 50 | 51 | ![](assets/teaser.png) 52 | 53 | ## Check out our paper! 54 | Our paper is available on [Arxiv](https://arxiv.org/abs/2403.05313). Please cite our paper if you find **RAT** useful for your research: 55 | ``` 56 | @article{wang2024rat, 57 | author = {Zihao, Wang and Anji, Liu and Haowei, Lin and Jiaqi, Li and Xiaojian, Ma and Yitao, Liang}, 58 | title = {RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Horizon Generation}, 59 | journal = {arXiv preprint arXiv: 2403.05313}, 60 | year = {2024}, 61 | } 62 | ``` 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | -------------------------------------------------------------------------------- /app/gradio_app.py: -------------------------------------------------------------------------------- 1 | import gradio as gr 2 | from langchain.tools import Tool 3 | from langchain_community.utilities import GoogleSearchAPIWrapper 4 | import os 5 | 6 | from langchain.tools import Tool 7 | from langchain_community.utilities import GoogleSearchAPIWrapper 8 | 9 | 10 | def get_search(query:str="", k:int=1): # get the top-k resources with google 11 | search = GoogleSearchAPIWrapper(k=k) 12 | def search_results(query): 13 | return search.results(query, k) 14 | tool = Tool( 15 | name="Google Search Snippets", 16 | description="Search Google for recent results.", 17 | func=search_results, 18 | ) 19 | ref_text = tool.run(query) 20 | if 'Result' not in ref_text[0].keys(): 21 | return ref_text 22 | else: 23 | return None 24 | 25 | from langchain_community.document_transformers import Html2TextTransformer 26 | from langchain_community.document_loaders import AsyncHtmlLoader 27 | def get_page_content(link:str): 28 | loader = AsyncHtmlLoader([link]) 29 | docs = loader.load() 30 | html2text = Html2TextTransformer() 31 | docs_transformed = html2text.transform_documents(docs) 32 | if len(docs_transformed) > 0: 33 | return docs_transformed[0].page_content 34 | else: 35 | return None 36 | 37 | import tiktoken 38 | def num_tokens_from_string(string: str, encoding_name: str = "cl100k_base") -> int: 39 | """Returns the number of tokens in a text string.""" 40 | encoding = tiktoken.get_encoding(encoding_name) 41 | num_tokens = len(encoding.encode(string)) 42 | return num_tokens 43 | 44 | def chunk_text_by_sentence(text, chunk_size=2048): 45 | """Chunk the $text into sentences with less than 2k tokens.""" 46 | sentences = text.split('. ') 47 | chunked_text = [] 48 | curr_chunk = [] 49 | # 逐句添加文本片段,确保每个段落都小于2k个token 50 | for sentence in sentences: 51 | if num_tokens_from_string(". ".join(curr_chunk)) + num_tokens_from_string(sentence) + 2 <= chunk_size: 52 | curr_chunk.append(sentence) 53 | else: 54 | chunked_text.append(". ".join(curr_chunk)) 55 | curr_chunk = [sentence] 56 | # 添加最后一个片段 57 | if curr_chunk: 58 | chunked_text.append(". ".join(curr_chunk)) 59 | return chunked_text[0] 60 | 61 | def chunk_text_front(text, chunk_size = 2048): 62 | ''' 63 | get the first `trunk_size` token of text 64 | ''' 65 | chunked_text = "" 66 | tokens = num_tokens_from_string(text) 67 | if tokens < chunk_size: 68 | return text 69 | else: 70 | ratio = float(chunk_size) / tokens 71 | char_num = int(len(text) * ratio) 72 | return text[:char_num] 73 | 74 | def chunk_texts(text, chunk_size = 2048): 75 | ''' 76 | trunk the text into n parts, return a list of text 77 | [text, text, text] 78 | ''' 79 | tokens = num_tokens_from_string(text) 80 | if tokens < chunk_size: 81 | return [text] 82 | else: 83 | texts = [] 84 | n = int(tokens/chunk_size) + 1 85 | # 计算每个部分的长度 86 | part_length = len(text) // n 87 | # 如果不能整除,则最后一个部分会包含额外的字符 88 | extra = len(text) % n 89 | parts = [] 90 | start = 0 91 | 92 | for i in range(n): 93 | # 对于前extra个部分,每个部分多分配一个字符 94 | end = start + part_length + (1 if i < extra else 0) 95 | parts.append(text[start:end]) 96 | start = end 97 | return parts 98 | 99 | from datetime import datetime 100 | 101 | from openai import OpenAI 102 | import openai 103 | import os 104 | 105 | chatgpt_system_prompt = f''' 106 | You are ChatGPT, a large language model trained by OpenAI, based on the GPT-4 architecture. 107 | Knowledge cutoff: 2023-04 108 | Current date: {datetime.now().strftime('%Y-%m-%d')} 109 | ''' 110 | 111 | def get_draft(question): 112 | # Getting the draft answer 113 | draft_prompt = ''' 114 | IMPORTANT: 115 | Try to answer this question/instruction with step-by-step thoughts and make the answer more structural. 116 | Use `\n\n` to split the answer into several paragraphs. 117 | Just respond to the instruction directly. DO NOT add additional explanations or introducement in the answer unless you are asked to. 118 | ''' 119 | # openai_client = OpenAI(api_key=openai.api_key) 120 | openai_client = OpenAI(api_key = os.getenv('OPENAI_API_KEY')) 121 | draft = openai_client.chat.completions.create( 122 | model="gpt-3.5-turbo", 123 | messages=[ 124 | { 125 | "role": "system", 126 | "content": chatgpt_system_prompt 127 | }, 128 | { 129 | "role": "user", 130 | "content": f"{question}" + draft_prompt 131 | } 132 | ], 133 | temperature = 1.0 134 | ).choices[0].message.content 135 | return draft 136 | 137 | def split_draft(draft, split_char = '\n\n'): 138 | # 将draft切分为多个段落 139 | # split_char: '\n\n' 140 | paragraphs = draft.split(split_char) 141 | draft_paragraphs = [para for para in paragraphs if len(para)>5] 142 | # print(f"The draft answer has {len(draft_paragraphs)}") 143 | return draft_paragraphs 144 | 145 | def split_draft_openai(question, answer, NUM_PARAGRAPHS = 4): 146 | split_prompt = f''' 147 | Split the answer of the question into multiple paragraphs with each paragraph containing a complete thought. 148 | The answer should be splited into less than {NUM_PARAGRAPHS} paragraphs. 149 | Use ## as splitting char to seperate the paragraphs. 150 | So you should output the answer with ## to split the paragraphs. 151 | **IMPORTANT** 152 | Just output the query directly. DO NOT add additional explanations or introducement in the answer unless you are asked to. 153 | ''' 154 | openai_client = OpenAI(api_key = os.getenv('OPENAI_API_KEY')) 155 | splited_answer = openai_client.chat.completions.create( 156 | model="gpt-3.5-turbo", 157 | messages=[ 158 | { 159 | "role": "system", 160 | "content": chatgpt_system_prompt 161 | }, 162 | { 163 | "role": "user", 164 | "content": f"##Question: {question}\n\n##Response: {answer}\n\n##Instruction: {split_prompt}" 165 | } 166 | ], 167 | temperature = 1.0 168 | ).choices[0].message.content 169 | split_draft_paragraphs = split_draft(splited_answer, split_char = '##') 170 | return split_draft_paragraphs 171 | 172 | def get_query(question, answer): 173 | query_prompt = ''' 174 | I want to verify the content correctness of the given question, especially the last sentences. 175 | Please summarize the content with the corresponding question. 176 | This summarization will be used as a query to search with Bing search engine. 177 | The query should be short but need to be specific to promise Bing can find related knowledge or pages. 178 | You can also use search syntax to make the query short and clear enough for the search engine to find relevant language data. 179 | Try to make the query as relevant as possible to the last few sentences in the content. 180 | **IMPORTANT** 181 | Just output the query directly. DO NOT add additional explanations or introducement in the answer unless you are asked to. 182 | ''' 183 | # openai_client = OpenAI(api_key = openai.api_key) 184 | openai_client = OpenAI(api_key = os.getenv('OPENAI_API_KEY')) 185 | query = openai_client.chat.completions.create( 186 | model="gpt-3.5-turbo", 187 | messages=[ 188 | { 189 | "role": "system", 190 | "content": chatgpt_system_prompt 191 | }, 192 | { 193 | "role": "user", 194 | "content": f"##Question: {question}\n\n##Content: {answer}\n\n##Instruction: {query_prompt}" 195 | } 196 | ], 197 | temperature = 1.0 198 | ).choices[0].message.content 199 | return query 200 | 201 | def get_content(query): 202 | res = get_search(query, 1) 203 | if not res: 204 | print(">>> No good Google Search Result was found") 205 | return None 206 | search_results = res[0] 207 | link = search_results['link'] # title, snippet 208 | res = get_page_content(link) 209 | if not res: 210 | print(f">>> No content was found in {link}") 211 | return None 212 | retrieved_text = res 213 | trunked_texts = chunk_texts(retrieved_text, 1500) 214 | trunked_texts = [trunked_text.replace('\n', " ") for trunked_text in trunked_texts] 215 | return trunked_texts 216 | 217 | def get_revise_answer(question, answer, content): 218 | revise_prompt = ''' 219 | I want to revise the answer according to retrieved related text of the question in WIKI pages. 220 | You need to check whether the answer is correct. 221 | If you find some errors in the answer, revise the answer to make it better. 222 | If you find some necessary details are ignored, add it to make the answer more plausible according to the related text. 223 | If you find the answer is right and do not need to add more details, just output the original answer directly. 224 | **IMPORTANT** 225 | Try to keep the structure (multiple paragraphs with its subtitles) in the revised answer and make it more structual for understanding. 226 | Add more details from retrieved text to the answer. 227 | Split the paragraphs with \n\n characters. 228 | Just output the revised answer directly. DO NOT add additional explanations or annoucement in the revised answer unless you are asked to. 229 | ''' 230 | # openai_client = OpenAI(api_key = openai.api_key) 231 | openai_client = OpenAI(api_key = os.getenv('OPENAI_API_KEY')) 232 | revised_answer = openai_client.chat.completions.create( 233 | model="gpt-3.5-turbo", 234 | messages=[ 235 | { 236 | "role": "system", 237 | "content": chatgpt_system_prompt 238 | }, 239 | { 240 | "role": "user", 241 | "content": f"##Existing Text in Wiki Web: {content}\n\n##Question: {question}\n\n##Answer: {answer}\n\n##Instruction: {revise_prompt}" 242 | } 243 | ], 244 | temperature = 1.0 245 | ).choices[0].message.content 246 | return revised_answer 247 | 248 | def get_reflect_answer(question, answer): 249 | reflect_prompt = ''' 250 | Give a title for the answer of the question. 251 | And add a subtitle to each paragraph in the answer and output the final answer using markdown format. 252 | This will make the answer to this question look more structured for better understanding. 253 | **IMPORTANT** 254 | Try to keep the structure (multiple paragraphs with its subtitles) in the response and make it more structual for understanding. 255 | Split the paragraphs with \n\n characters. 256 | Just output the revised answer directly. DO NOT add additional explanations or annoucement in the revised answer unless you are asked to. 257 | ''' 258 | openai_client = OpenAI(api_key = os.getenv('OPENAI_API_KEY')) 259 | reflected_answer = openai_client.chat.completions.create( 260 | model="gpt-3.5-turbo", 261 | messages=[ 262 | { 263 | "role": "system", 264 | "content": chatgpt_system_prompt 265 | }, 266 | { 267 | "role": "user", 268 | "content": f"##Question:\n{question}\n\n##Answer:\n{answer}\n\n##Instruction:\n{reflect_prompt}" 269 | } 270 | ], 271 | temperature = 1.0 272 | ).choices[0].message.content 273 | return reflected_answer 274 | 275 | def get_query_wrapper(q, question, answer): 276 | result = get_query(question, answer) 277 | q.put(result) # 将结果放入队列 278 | 279 | def get_content_wrapper(q, query): 280 | result = get_content(query) 281 | q.put(result) # 将结果放入队列 282 | 283 | def get_revise_answer_wrapper(q, question, answer, content): 284 | result = get_revise_answer(question, answer, content) 285 | q.put(result) 286 | 287 | def get_reflect_answer_wrapper(q, question, answer): 288 | result = get_reflect_answer(question, answer) 289 | q.put(result) 290 | 291 | from multiprocessing import Process, Queue 292 | def run_with_timeout(func, timeout, *args, **kwargs): 293 | q = Queue() # 创建一个Queue对象用于进程间通信 294 | # 创建一个进程来执行传入的函数,将Queue和其他*args、**kwargs作为参数传递 295 | p = Process(target=func, args=(q, *args), kwargs=kwargs) 296 | p.start() 297 | # 等待进程完成或超时 298 | p.join(timeout) 299 | if p.is_alive(): 300 | print(f"{datetime.now()} [INFO] Function {str(func)} running timeout ({timeout}s), terminating...") 301 | p.terminate() # 终止进程 302 | p.join() # 确保进程已经终止 303 | result = None # 超时情况下,我们没有结果 304 | else: 305 | print(f"{datetime.now()} [INFO] Function {str(func)} executed successfully.") 306 | result = q.get() # 从队列中获取结果 307 | return result 308 | 309 | from difflib import unified_diff 310 | from IPython.display import display, HTML 311 | 312 | def generate_diff_html(text1, text2): 313 | diff = unified_diff(text1.splitlines(keepends=True), 314 | text2.splitlines(keepends=True), 315 | fromfile='text1', tofile='text2') 316 | 317 | diff_html = "" 318 | for line in diff: 319 | if line.startswith('+'): 320 | diff_html += f"
{line.rstrip()}
" 321 | elif line.startswith('-'): 322 | diff_html += f"
{line.rstrip()}
" 323 | elif line.startswith('@'): 324 | diff_html += f"
{line.rstrip()}
" 325 | else: 326 | diff_html += f"{line.rstrip()}
" 327 | return diff_html 328 | 329 | newline_char = '\n' 330 | 331 | def rat(question): 332 | print(f"{datetime.now()} [INFO] Generating draft...") 333 | draft = get_draft(question) 334 | print(f"{datetime.now()} [INFO] Return draft.") 335 | # print(f"##################### DRAFT #######################") 336 | # print(draft) 337 | # print(f"##################### END #######################") 338 | 339 | print(f"{datetime.now()} [INFO] Processing draft ...") 340 | # draft_paragraphs = split_draft(draft) 341 | draft_paragraphs = split_draft_openai(question, draft) 342 | print(f"{datetime.now()} [INFO] Draft is splitted into {len(draft_paragraphs)} sections.") 343 | answer = "" 344 | for i, p in enumerate(draft_paragraphs): 345 | # print(str(i)*80) 346 | print(f"{datetime.now()} [INFO] Revising {i+1}/{len(draft_paragraphs)} sections ...") 347 | answer = answer + '\n\n' + p 348 | # print(f"[{i}/{len(draft_paragraphs)}] Original Answer:\n{answer.replace(newline_char, ' ')}") 349 | 350 | # query = get_query(question, answer) 351 | print(f"{datetime.now()} [INFO] Generating query ...") 352 | res = run_with_timeout(get_query_wrapper, 30, question, answer) 353 | if not res: 354 | print(f"{datetime.now()} [INFO] Generating query timeout, skipping...") 355 | continue 356 | else: 357 | query = res 358 | print(f">>> {i}/{len(draft_paragraphs)} Query: {query.replace(newline_char, ' ')}") 359 | 360 | print(f"{datetime.now()} [INFO] Crawling network pages ...") 361 | # content = get_content(query) 362 | res = run_with_timeout(get_content_wrapper, 30, query) 363 | if not res: 364 | print(f"{datetime.now()} [INFO] Parsing network pages timeout, skipping ...") 365 | continue 366 | else: 367 | content = res 368 | 369 | LIMIT = 2 370 | for j, c in enumerate(content): 371 | if j >= LIMIT: # limit rge number of network pages 372 | break 373 | print(f"{datetime.now()} [INFO] Revising answers with retrieved network pages...[{j}/{min(len(content),LIMIT)}]") 374 | # answer = get_revise_answer(question, answer, c) 375 | res = run_with_timeout(get_revise_answer_wrapper, 30, question, answer, c) 376 | if not res: 377 | print(f"{datetime.now()} [INFO] Revising answers timeout, skipping ...") 378 | continue 379 | else: 380 | diff_html = generate_diff_html(answer, res) 381 | display(HTML(diff_html)) 382 | answer = res 383 | print(f"{datetime.now()} [INFO] Answer revised [{j}/{min(len(content),3)}]") 384 | # print(f"[{i}/{len(draft_paragraphs)}] REVISED ANSWER:\n {answer.replace(newline_char, ' ')}") 385 | # print() 386 | res = run_with_timeout(get_reflect_answer_wrapper, 30, question, answer) 387 | if not res: 388 | print(f"{datetime.now()} [INFO] Reflecting answers timeout, skipping next steps...") 389 | else: 390 | answer = res 391 | return draft, answer 392 | 393 | page_title = "RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Horizon Generation" 394 | page_md = """ 395 | # RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Horizon Generation 396 | 397 | We explore how iterative revising a chain of thoughts with the help of information retrieval significantly improves large language models' reasoning and generation ability in long-horizon generation tasks, while hugely mitigating hallucination. In particular, the proposed method — retrieval-augmented thoughts (RAT) — revises each thought step one by one with retrieved information relevant to the task query, the current and the past thought steps, after the initial zero-shot CoT is generated. 398 | 399 | Applying RAT to various base models substantially improves their performances on various long-horizon generation tasks; on average of relatively increasing rating scores by 13.63% on code generation, 16.96% on mathematical reasoning, 19.2% on creative writing, and 42.78% on embodied task planning. 400 | 401 | Feel free to try our demo! 402 | 403 | """ 404 | 405 | def clear_func(): 406 | return "", "", "" 407 | 408 | def set_openai_api_key(api_key): 409 | if api_key and api_key.startswith("sk-") and len(api_key) > 50: 410 | os.environ["OPENAI_API_KEY"] = api_key 411 | 412 | with gr.Blocks(title = page_title) as demo: 413 | 414 | gr.Markdown(page_md) 415 | 416 | with gr.Row(): 417 | chatgpt_box = gr.Textbox( 418 | label = "ChatGPT", 419 | placeholder = "Response from ChatGPT with zero-shot chain-of-thought.", 420 | elem_id = "chatgpt" 421 | ) 422 | 423 | with gr.Row(): 424 | stream_box = gr.Textbox( 425 | label = "Streaming", 426 | placeholder = "Interactive response with RAT...", 427 | elem_id = "stream", 428 | lines = 10, 429 | visible = False 430 | ) 431 | 432 | with gr.Row(): 433 | rat_box = gr.Textbox( 434 | label = "RAT", 435 | placeholder = "Final response with RAT ...", 436 | elem_id = "rat", 437 | lines = 6 438 | ) 439 | 440 | with gr.Column(elem_id="instruction_row"): 441 | with gr.Row(): 442 | instruction_box = gr.Textbox( 443 | label = "instruction", 444 | placeholder = "Enter your instruction here", 445 | lines = 2, 446 | elem_id="instruction", 447 | interactive=True, 448 | visible=True 449 | ) 450 | # with gr.Row(): 451 | # model_radio = gr.Radio(["gpt-3.5-turbo", "gpt-4", "GPT-4-turbo"], elem_id="model_radio", value="gpt-3.5-turbo", 452 | # label='GPT model', 453 | # show_label=True, 454 | # interactive=True, 455 | # visible=True) 456 | # openai_api_key_textbox = gr.Textbox( 457 | # label='OpenAI API key', 458 | # placeholder="Paste your OpenAI API key (sk-...) and hit Enter", 459 | # show_label=True, 460 | # lines=1, 461 | # type='password') 462 | 463 | # openai_api_key_textbox.change(set_openai_api_key, 464 | # inputs=[openai_api_key_textbox], 465 | # outputs=[]) 466 | 467 | with gr.Row(): 468 | submit_btn = gr.Button( 469 | value="submit", visible=True, interactive=True 470 | ) 471 | clear_btn = gr.Button( 472 | value="clear", visible=True, interactive=True 473 | ) 474 | regenerate_btn = gr.Button( 475 | value="regenerate", visible=True, interactive=True 476 | ) 477 | 478 | submit_btn.click( 479 | fn = rat, 480 | inputs = [instruction_box], 481 | outputs = [chatgpt_box, rat_box] 482 | ) 483 | 484 | clear_btn.click( 485 | fn = clear_func, 486 | inputs = [], 487 | outputs = [instruction_box, chatgpt_box, rat_box] 488 | ) 489 | 490 | regenerate_btn.click( 491 | fn = rat, 492 | inputs = [instruction_box], 493 | outputs = [chatgpt_box, rat_box] 494 | ) 495 | 496 | examples = gr.Examples( 497 | examples=[ 498 | # "I went to the supermarket yesterday.", 499 | # "Helen is a good swimmer." 500 | "Write a survey of retrieval-augmented generation in Large Language Models.", 501 | "Introduce Jin-Yong's life and his works.", 502 | "Summarize the American Civil War according to the timeline.", 503 | "Describe the life and achievements of Marie Curie" 504 | ], 505 | inputs=[instruction_box] 506 | ) 507 | 508 | demo.launch(server_name="0.0.0.0", debug=True) -------------------------------------------------------------------------------- /creative.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "7TX0mtitYYN_" 7 | }, 8 | "source": [ 9 | "# Retrieval-augmented Thoughts" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": { 16 | "tags": [] 17 | }, 18 | "outputs": [ 19 | { 20 | "name": "stdout", 21 | "output_type": "stream", 22 | "text": [ 23 | "Note: you may need to restart the kernel to use updated packages.\n" 24 | ] 25 | } 26 | ], 27 | "source": [ 28 | "# source: https://medium.com/@greyboi/ddgsearch-search-duckduckgo-scrape-the-results-in-python-18f5265f1aa6\n", 29 | "%pip install --upgrade --quiet duckduckgo-search" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": { 36 | "tags": [] 37 | }, 38 | "outputs": [], 39 | "source": [ 40 | "# %%capture\n", 41 | "# !pip install boto3 --upgrade" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 3, 47 | "metadata": { 48 | "tags": [] 49 | }, 50 | "outputs": [], 51 | "source": [ 52 | "import boto3\n", 53 | "import os\n", 54 | "import json\n", 55 | "import re\n", 56 | "\n", 57 | "bedrock = boto3.client(service_name='bedrock-runtime')" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 4, 63 | "metadata": { 64 | "tags": [] 65 | }, 66 | "outputs": [], 67 | "source": [ 68 | "# model params\n", 69 | "max_tokens = 4096\n", 70 | "temperature = 0\n", 71 | "top_k = 250 # optional\n", 72 | "top_p = 0.999 # optional\n", 73 | "\n", 74 | "anthropic_version = 'bedrock-2023-05-31'\n", 75 | "accept = 'application/json'\n", 76 | "contentType = 'application/json'\n", 77 | "\n", 78 | "# set the Claude 3 model ID in Bedrock\n", 79 | "model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 50, 85 | "metadata": { 86 | "id": "V8ox9jk5Y_ZC", 87 | "tags": [] 88 | }, 89 | "outputs": [], 90 | "source": [ 91 | "# Basic Tool Functions\n", 92 | "import os\n", 93 | "import json\n", 94 | "\n", 95 | "from duckduckgo_search import DDGS\n", 96 | "def get_search(query:str=\"\", k:int=3): # get the top-k resources with DuckDuckGo\n", 97 | " return DDGS().text(query.replace('\"',''), max_results=k)\n", 98 | "\n", 99 | "from langchain_community.document_transformers import Html2TextTransformer\n", 100 | "from langchain_community.document_loaders import AsyncHtmlLoader\n", 101 | "def get_page_content(href:str):\n", 102 | " loader = AsyncHtmlLoader([href])\n", 103 | " docs = loader.load()\n", 104 | " html2text = Html2TextTransformer()\n", 105 | " docs_transformed = html2text.transform_documents(docs)\n", 106 | " if len(docs_transformed) > 0:\n", 107 | " return docs_transformed[0].page_content\n", 108 | " else:\n", 109 | " return None\n", 110 | "\n", 111 | "import tiktoken\n", 112 | "def num_tokens_from_string(string: str, encoding_name: str = \"cl100k_base\") -> int:\n", 113 | " \"\"\"Returns the number of tokens in a text string.\"\"\"\n", 114 | " encoding = tiktoken.get_encoding(encoding_name)\n", 115 | " num_tokens = len(encoding.encode(string))\n", 116 | " return num_tokens\n", 117 | "\n", 118 | "def chunk_text_by_sentence(text, chunk_size=2048):\n", 119 | " \"\"\"Chunk the $text into sentences with less than 2k tokens.\"\"\"\n", 120 | " sentences = text.split('. ')\n", 121 | " chunked_text = []\n", 122 | " curr_chunk = []\n", 123 | " # 逐句添加文本片段,确保每个段落都小于2k个token\n", 124 | " for sentence in sentences:\n", 125 | " if num_tokens_from_string(\". \".join(curr_chunk)) + num_tokens_from_string(sentence) + 2 <= chunk_size:\n", 126 | " curr_chunk.append(sentence)\n", 127 | " else:\n", 128 | " chunked_text.append(\". \".join(curr_chunk))\n", 129 | " curr_chunk = [sentence]\n", 130 | " # 添加最后一个片段\n", 131 | " if curr_chunk:\n", 132 | " chunked_text.append(\". \".join(curr_chunk))\n", 133 | " return chunked_text[0]\n", 134 | "\n", 135 | "def chunk_text_front(text, chunk_size = 2048):\n", 136 | " '''\n", 137 | " get the first `trunk_size` token of text\n", 138 | " '''\n", 139 | " chunked_text = \"\"\n", 140 | " tokens = num_tokens_from_string(text)\n", 141 | " if tokens < chunk_size:\n", 142 | " return text\n", 143 | " else:\n", 144 | " ratio = float(chunk_size) / tokens\n", 145 | " char_num = int(len(text) * ratio)\n", 146 | " return text[:char_num]\n", 147 | "\n", 148 | "def chunk_texts(text, chunk_size = 2048):\n", 149 | " '''\n", 150 | " trunk the text into n parts, return a list of text\n", 151 | " [text, text, text]\n", 152 | " '''\n", 153 | " tokens = num_tokens_from_string(text)\n", 154 | " if tokens < chunk_size:\n", 155 | " return [text]\n", 156 | " else:\n", 157 | " texts = []\n", 158 | " n = int(tokens/chunk_size) + 1\n", 159 | " # 计算每个部分的长度\n", 160 | " part_length = len(text) // n\n", 161 | " # 如果不能整除,则最后一个部分会包含额外的字符\n", 162 | " extra = len(text) % n\n", 163 | " parts = []\n", 164 | " start = 0\n", 165 | "\n", 166 | " for i in range(n):\n", 167 | " # 对于前extra个部分,每个部分多分配一个字符\n", 168 | " end = start + part_length + (1 if i < extra else 0)\n", 169 | " parts.append(text[start:end])\n", 170 | " start = end\n", 171 | " return parts" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 74, 177 | "metadata": { 178 | "id": "4HBQ5onEn_m-" 179 | }, 180 | "outputs": [], 181 | "source": [ 182 | "# RAT Pipeline\n", 183 | "\n", 184 | "from datetime import datetime\n", 185 | "anthropic_system_prompt = f'''\n", 186 | "You are an AI assistant called Claude, created by Anthropic. The current date is {datetime.now().strftime('%Y-%m-%d')}.\n", 187 | "Claude's knowledge base was last updated on August 2023. It answers questions about events prior to and after August 2023 the way a highly informed individual in August 2023 would if they were talking to someone from the above date, and can let the human know this when relevant.\n", 188 | "It should give concise responses to very simple questions, but provide thorough responses to more complex and open-ended questions.\n", 189 | "If it is asked to assist with tasks involving the expression of views held by a significant number of people, Claude provides assistance with the task even if it personally disagrees with the views being expressed, but follows this with a discussion of broader perspectives.\n", 190 | "Claude doesn't engage in stereotyping, including the negative stereotyping of majority groups.\n", 191 | "If asked about controversial topics, Claude tries to provide careful thoughts and objective information without downplaying its harmful content or implying that there are reasonable perspectives on both sides.\n", 192 | "It is happy to help with writing, analysis, question answering, math, coding, and all sorts of other tasks. It uses markdown for coding.\n", 193 | "It does not mention this information about itself unless the information is directly pertinent to the human's query.\n", 194 | "'''\n", 195 | "\n", 196 | "def get_draft(question):\n", 197 | " # Getting the draft answer\n", 198 | " draft_prompt = '''\n", 199 | "IMPORTANT:\n", 200 | "Try to answer this question/instruction with step-by-step thoughts and make the answer more structured.\n", 201 | "Use `\\n\\n` to split the answer into several paragraphs.\n", 202 | "Just respond to the instruction directly. DO NOT add additional explanations or text in the answer unless you are asked to.\n", 203 | "'''\n", 204 | " messages=[{\"role\": \"user\", \"content\": f\"{question}\" + draft_prompt}]\n", 205 | "\n", 206 | " body = json.dumps(\n", 207 | " {\n", 208 | " \"max_tokens\": max_tokens,\n", 209 | " \"temperature\": temperature,\n", 210 | " \"top_k\": top_k,\n", 211 | " \"top_p\": top_p,\n", 212 | " \"anthropic_version\": anthropic_version,\n", 213 | " \"system\": anthropic_system_prompt,\n", 214 | " \"messages\": messages,\n", 215 | " })\n", 216 | " \n", 217 | " response = bedrock.invoke_model(body=body, modelId=model_id, accept=accept, contentType=contentType)\n", 218 | " response_body = json.loads(response.get('body').read())\n", 219 | " return response_body['content'][0]['text']\n", 220 | "\n", 221 | "def split_draft(draft, split_char = '\\n\\n'):\n", 222 | " # 将draft切分为多个段落\n", 223 | " # split_char: '\\n\\n'\n", 224 | " draft_paragraphs = draft.split(split_char)\n", 225 | " # print(f\"The draft answer has {len(draft_paragraphs)}\")\n", 226 | " return draft_paragraphs\n", 227 | "\n", 228 | "def get_query(question, answer):\n", 229 | " query_prompt = '''\n", 230 | "I want to verify the content correctness of the given question, especially the last sentences.\n", 231 | "Please summarize the content with the corresponding question.\n", 232 | "This summarization will be used as a query to given to a search engine.\n", 233 | "The query should be short but needs to be specific to make sure the search engine can find related knowledge or web pages.\n", 234 | "You can also use search syntax to make the query short and clear enough for the search engine to find relevant language data.\n", 235 | "Try to make the query as relevant as possible to the last few sentences in the content.\n", 236 | "**IMPORTANT**\n", 237 | "Just output the query directly. DO NOT add additional explanations or text in the answer unless you are asked to.\n", 238 | "'''\n", 239 | " messages=[{\"role\": \"user\",\"content\": f\"##Question: {question}\\n\\n##Content: {answer}\\n\\n##Instruction: {query_prompt}\"}]\n", 240 | "\n", 241 | " body = json.dumps(\n", 242 | " {\n", 243 | " \"max_tokens\": max_tokens,\n", 244 | " \"temperature\": temperature,\n", 245 | " \"top_k\": top_k,\n", 246 | " \"top_p\": top_p,\n", 247 | " \"anthropic_version\": anthropic_version,\n", 248 | " \"system\": anthropic_system_prompt,\n", 249 | " \"messages\": messages,\n", 250 | " })\n", 251 | "\n", 252 | " response = bedrock.invoke_model(body=body, modelId=model_id, accept=accept, contentType=contentType)\n", 253 | " response_body = json.loads(response.get('body').read())\n", 254 | " return response_body['content'][0]['text']\n", 255 | "\n", 256 | "\n", 257 | "def get_content(query):\n", 258 | " res = get_search(query, 1)\n", 259 | " if not res:\n", 260 | " print(\">>> No good search result was found\")\n", 261 | " return None\n", 262 | " search_results = res[0]\n", 263 | " href = search_results['href'] # title, snippet\n", 264 | " res = get_page_content(href)\n", 265 | " if not res:\n", 266 | " print(f\">>> No content was found in {href}\")\n", 267 | " return None\n", 268 | " retrieved_text = res\n", 269 | " trunked_texts = chunk_texts(retrieved_text, 1500)\n", 270 | " trunked_texts = [trunked_text.replace('\\n', \" \") for trunked_text in trunked_texts]\n", 271 | " if trunked_texts: print(f\"Funcióno bien para query: {query}\")\n", 272 | " return trunked_texts\n", 273 | "\n", 274 | "def get_revise_answer(question, answer, content):\n", 275 | " revise_prompt = '''\n", 276 | "I want to revise the answer according to retrieved related text of the question in WIKI pages.\n", 277 | "You need to check whether the answer is correct.\n", 278 | "If you find some errors in the answer, revise the answer to make it better.\n", 279 | "If you find some necessary details are ignored, add it to make the answer more plausible according to the related text.\n", 280 | "If you find the answer is right and do not need to add more details, just output the original answer directly.\n", 281 | "**IMPORTANT**\n", 282 | "Try to keep the structure (multiple paragraphs with its subtitles) in the revised answer and make it more structured to improve understanding.\n", 283 | "Split the paragraphs with `\\n\\n` characters.\n", 284 | "Just output the revised answer directly. DO NOT add additional explanations or text in the revised answer unless you are asked to.\n", 285 | "'''\n", 286 | " messages=[{\"role\": \"user\", \"content\": f\"##Existing Text in Wiki Web: {content}\\n\\n##Question: {question}\\n\\n##Answer: {answer}\\n\\n##Instruction: {revise_prompt}\"}]\n", 287 | "\n", 288 | " body = json.dumps(\n", 289 | " {\n", 290 | " \"max_tokens\": max_tokens,\n", 291 | " \"temperature\": temperature,\n", 292 | " \"top_k\": top_k,\n", 293 | " \"top_p\": top_p,\n", 294 | " \"anthropic_version\": anthropic_version,\n", 295 | " \"system\": anthropic_system_prompt,\n", 296 | " \"messages\": messages,\n", 297 | " })\n", 298 | "\n", 299 | " response = bedrock.invoke_model(body=body, modelId=model_id, accept=accept, contentType=contentType)\n", 300 | " response_body = json.loads(response.get('body').read())\n", 301 | " return response_body['content'][0]['text']\n", 302 | "\n", 303 | "def get_reflect_answer(question, answer):\n", 304 | " reflect_prompt = '''\n", 305 | "Give a title for the answer of the question.\n", 306 | "And add a subtitle to each paragraph in the answer and output the final answer using markdown format. \n", 307 | "This will make the answer to this question look more structured for better understanding.\n", 308 | "**IMPORTANT**\n", 309 | "Try to keep the structure (multiple paragraphs with its subtitles) in the response and make it more structured for understanding.\n", 310 | "Split the paragraphs with \\n\\n characters.\n", 311 | "Just output the revised answer directly. DO NOT add additional explanations or text in the revised answer unless you are asked to.\n", 312 | "'''\n", 313 | " messages=[{\"role\": \"user\", \"content\": f\"##Question:\\n{question}\\n\\n##Answer:\\n{answer}\\n\\n##Instruction:\\n{reflect_prompt}\"}]\n", 314 | "\n", 315 | " body = json.dumps(\n", 316 | " {\n", 317 | " \"max_tokens\": max_tokens,\n", 318 | " \"temperature\": temperature,\n", 319 | " \"top_k\": top_k,\n", 320 | " \"top_p\": top_p,\n", 321 | " \"anthropic_version\": anthropic_version,\n", 322 | " \"system\": anthropic_system_prompt,\n", 323 | " \"messages\": messages,\n", 324 | " })\n", 325 | "\n", 326 | " response = bedrock.invoke_model(body=body, modelId=model_id, accept=accept, contentType=contentType)\n", 327 | " response_body = json.loads(response.get('body').read())\n", 328 | " return response_body['content'][0]['text']" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": 52, 334 | "metadata": { 335 | "tags": [] 336 | }, 337 | "outputs": [], 338 | "source": [ 339 | "query=\"ricardo fort empresario negocios inmobiliarios productos belleza\"" 340 | ] 341 | }, 342 | { 343 | "cell_type": "code", 344 | "execution_count": 75, 345 | "metadata": { 346 | "id": "yW1yp-BQQUxp" 347 | }, 348 | "outputs": [], 349 | "source": [ 350 | "def get_query_wrapper(q, question, answer):\n", 351 | " result = get_query(question, answer)\n", 352 | " q.put(result) # pone el resultado en la cola\n", 353 | "\n", 354 | "def get_content_wrapper(q, query):\n", 355 | " result = get_content(query)\n", 356 | " print(result)\n", 357 | " q.put(result) # pone el resultado en la cola\n", 358 | "\n", 359 | "def get_revise_answer_wrapper(q, question, answer, content):\n", 360 | " result = get_revise_answer(question, answer, content)\n", 361 | " q.put(result)\n", 362 | "\n", 363 | "def get_reflect_answer_wrapper(q, question, answer):\n", 364 | " result = get_reflect_answer(question, answer)\n", 365 | " q.put(result)\n", 366 | "\n", 367 | "from multiprocessing import Process, Queue\n", 368 | "from datetime import datetime\n", 369 | "\n", 370 | "def run_with_timeout(func, timeout, *args, **kwargs):\n", 371 | " q = Queue() # crea un objeto Queue para la comunicación entre procesos\n", 372 | " p = Process(target=func, args=(q, *args), kwargs=kwargs)\n", 373 | " p.start()\n", 374 | " p.join(timeout)\n", 375 | " if p.is_alive():\n", 376 | " # Log con timestamp más claro y explicación del timeout\n", 377 | " print(f\"{datetime.now()} - [INFO] Timeout: La función {func.__name__} excedió el tiempo de {timeout}s.\")\n", 378 | " p.terminate()\n", 379 | " p.join()\n", 380 | " return {'error': 'timeout', 'detail': f'Function {func.__name__} exceeded {timeout} seconds.'}\n", 381 | " else:\n", 382 | " # Log de éxito\n", 383 | " print(f\"{datetime.now()} - [INFO] La función {func.__name__} completó su ejecución exitosamente.\")\n", 384 | " if not q.empty():\n", 385 | " return q.get()\n", 386 | " else:\n", 387 | " # Manejo en caso de que la cola esté vacía (indicaría otro tipo de problema)\n", 388 | " return {'error': 'empty_queue', 'detail': 'No result was returned from the process.'}" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 69, 394 | "metadata": {}, 395 | "outputs": [], 396 | "source": [ 397 | "from difflib import unified_diff\n", 398 | "from IPython.display import display, HTML\n", 399 | "\n", 400 | "def generate_diff_html(text1, text2):\n", 401 | " diff = unified_diff(text1.splitlines(keepends=True),\n", 402 | " text2.splitlines(keepends=True),\n", 403 | " fromfile='text1', tofile='text2')\n", 404 | "\n", 405 | " diff_html = \"\"\n", 406 | " for line in diff:\n", 407 | " if line.startswith('+'):\n", 408 | " diff_html += f\"
{line.rstrip()}
\"\n", 409 | " elif line.startswith('-'):\n", 410 | " diff_html += f\"
{line.rstrip()}
\"\n", 411 | " elif line.startswith('@'):\n", 412 | " diff_html += f\"
{line.rstrip()}
\"\n", 413 | " else:\n", 414 | " diff_html += f\"{line.rstrip()}
\"\n", 415 | " return diff_html" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 88, 421 | "metadata": { 422 | "id": "jE3Y78zfoLRc" 423 | }, 424 | "outputs": [], 425 | "source": [ 426 | "# RAT Function\n", 427 | "newline_char = '\\n'\n", 428 | "\n", 429 | "def rat(question):\n", 430 | " print(f\"{datetime.now()} [INFO] Te estoy armando un borrador con Claude3 ...\")\n", 431 | " draft = get_draft(question)\n", 432 | " print(f\"--------------------- Borrador ---------------------\")\n", 433 | " print(draft)\n", 434 | " print(f\"--------------------- Fin ------------------------\")\n", 435 | "\n", 436 | " print(f\"{datetime.now()} [INFO] Procesando el borrador ...\")\n", 437 | " draft_paragraphs = split_draft(draft)\n", 438 | " print(f\"{datetime.now()} [INFO] Te lo dividí en {len(draft_paragraphs)} partes.\")\n", 439 | " answer = \"\"\n", 440 | " for i, p in enumerate(draft_paragraphs):\n", 441 | " print(str(\"-\")*80)\n", 442 | " print(f\"{datetime.now()} [INFO] Vamos a revisar la parte [{i+1}/{len(draft_paragraphs)}] ...\")\n", 443 | " answer = answer + '\\n\\n' + p\n", 444 | " print(f\"[{i}/{len(draft_paragraphs)}] Respuesta original:\\n{answer.replace(newline_char, ' ')}\")\n", 445 | "\n", 446 | " # query = get_query(question, answer)\n", 447 | " print(f\"{datetime.now()} [INFO] Generamos una 'query` que vamos a usar para buscar después ...\")\n", 448 | " res = run_with_timeout(get_query_wrapper, 30, question, answer)\n", 449 | " if not res:\n", 450 | " print(f\"{datetime.now()} [INFO] Hay un timeout, vamos a saltearlo ...\")\n", 451 | " continue\n", 452 | " else:\n", 453 | " query = res\n", 454 | " print(f\">>> {i}/{len(draft_paragraphs)} Query: {query.replace(newline_char, ' ')}\")\n", 455 | "\n", 456 | " print(f\"{datetime.now()} [INFO] Arrancamos a crawlear las páginas ...\")\n", 457 | " # content = get_content(query)\n", 458 | " res = run_with_timeout(get_content_wrapper, 30, query)\n", 459 | " if not res:\n", 460 | " print(f\"{datetime.now()} [INFO] Hay un timeout, vamos a saltearlo ...\")\n", 461 | " continue\n", 462 | " else:\n", 463 | " content = res\n", 464 | "\n", 465 | " LIMIT = 2\n", 466 | " for j, c in enumerate(content):\n", 467 | " if j >= LIMIT: # limit large number of network pages\n", 468 | " break\n", 469 | " print(f\"{datetime.now()} [INFO] Revisamos las respuestas contra las páginas ...[{j}/{min(len(content),LIMIT)}]\")\n", 470 | " # answer = get_revise_answer(question, answer, c)\n", 471 | " res = run_with_timeout(get_revise_answer_wrapper, 30, question, answer, c)\n", 472 | " if not res:\n", 473 | " print(f\"{datetime.now()} [INFO] Hay un timeout, vamos a saltearlo ...\")\n", 474 | " continue\n", 475 | " else:\n", 476 | " diff_html = generate_diff_html(answer, res)\n", 477 | " display(HTML(diff_html))\n", 478 | " answer = res\n", 479 | " print(f\"{datetime.now()} [INFO] Respuesta revisada: [{j}/{min(len(content),3)}]\")\n", 480 | " print(f\"[{i}/{len(draft_paragraphs)}] RESPUESTA REVISADA:\\n {answer.replace(newline_char, ' ')}\")\n", 481 | " res = run_with_timeout(get_reflect_answer_wrapper, 30, question, answer)\n", 482 | " if not res:\n", 483 | " print(f\"{datetime.now()} [INFO] Hay un timeout, vamos a saltearlo ...\")\n", 484 | " else:\n", 485 | " answer = res\n", 486 | " return draft, answer" 487 | ] 488 | }, 489 | { 490 | "cell_type": "code", 491 | "execution_count": null, 492 | "metadata": { 493 | "colab": { 494 | "base_uri": "https://localhost:8080/" 495 | }, 496 | "id": "vr7TsTHUes7k", 497 | "outputId": "41bff12a-c2d1-45b0-d15f-eccdfe572b7e" 498 | }, 499 | "outputs": [ 500 | { 501 | "name": "stdout", 502 | "output_type": "stream", 503 | "text": [ 504 | "2024-04-11 17:44:24.659440 [INFO] Te estoy armando un borrador con Claude3 ...\n", 505 | "--------------------- Borrador ---------------------\n", 506 | "Aquí están mis pensamientos paso a paso sobre la vida de Ricardo Fort:\n", 507 | "\n", 508 | "`Ricardo Fort fue un empresario, productor de televisión y celebridad argentina muy conocida. Nació en 1968 en Buenos Aires, Argentina.\n", 509 | "\n", 510 | "Fort se hizo famoso por su participación en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.\n", 511 | "\n", 512 | "A principios de la década de 2000, Fort fundó su propia productora de televisión y produjo varios programas exitosos. También incursionó en los negocios inmobiliarios y la venta de productos de belleza.\n", 513 | "\n", 514 | "Lamentablemente, Ricardo Fort falleció en 2013 a la edad de 45 años debido a una insuficiencia cardíaca y otras complicaciones de salud. Dejó atrás a sus dos hijos gemelos y un legado como una de las figuras más polémicas y excéntricas de la televisión argentina.`\n", 515 | "--------------------- Fin ------------------------\n", 516 | "2024-04-11 17:44:33.837852 [INFO] Procesando el borrador ...\n", 517 | "2024-04-11 17:44:33.837880 [INFO] Te lo dividí en 5 partes.\n", 518 | "--------------------------------------------------------------------------------\n", 519 | "2024-04-11 17:44:33.837897 [INFO] Vamos a revisar la parte [1/5] ...\n", 520 | "[0/5] Respuesta original:\n", 521 | " Aquí están mis pensamientos paso a paso sobre la vida de Ricardo Fort:\n", 522 | "2024-04-11 17:44:33.837913 [INFO] Generamos una 'query` que vamos a usar para buscar después ...\n", 523 | "2024-04-11 17:44:37.000718 - [INFO] La función get_query_wrapper completó su ejecución exitosamente.\n", 524 | ">>> 0/5 Query: \"Ricardo Fort\" \"vida\" \"controversias\"\n", 525 | "2024-04-11 17:44:37.001748 [INFO] Arrancamos a crawlear las páginas ...\n", 526 | "2024-04-11 17:45:07.031320 - [INFO] Timeout: La función get_content_wrapper excedió el tiempo de 30s.\n", 527 | "2024-04-11 17:45:07.035918 [INFO] Revisamos las respuestas contra las páginas ...[0/2]\n", 528 | "2024-04-11 17:45:17.374293 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 529 | ] 530 | }, 531 | { 532 | "data": { 533 | "text/html": [ 534 | "
--- text1
+++ text2
@@ -1,3 +1,19 @@
+Biografía

+Ricardo Fort nació el 23 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Fue un empresario, productor de televisión y celebridad mediática argentina.

-Aquí están mis pensamientos paso a paso sobre la vida de Ricardo Fort:
+Inicios y carrera empresarial
+
+Fort se inició en el mundo de los negocios a temprana edad, trabajando en la empresa familiar dedicada a la venta de artículos de limpieza. Posteriormente, se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial.
+
+Fama mediática
+
+A principios de la década de 2000, Fort comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante y su estilo de vida ostentoso. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial.
+
+Vida personal
+
+Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica y los escándalos mediáticos.
+
+Fallecimiento
+
+Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 535 | ], 536 | "text/plain": [ 537 | "" 538 | ] 539 | }, 540 | "metadata": {}, 541 | "output_type": "display_data" 542 | }, 543 | { 544 | "name": "stdout", 545 | "output_type": "stream", 546 | "text": [ 547 | "2024-04-11 17:45:17.378051 [INFO] Respuesta revisada: [0/2]\n", 548 | "2024-04-11 17:45:17.378108 [INFO] Revisamos las respuestas contra las páginas ...[1/2]\n", 549 | "2024-04-11 17:45:25.580455 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 550 | ] 551 | }, 552 | { 553 | "data": { 554 | "text/html": [ 555 | "
--- text1
+++ text2
@@ -1,19 +1,17 @@
Biografía

-Ricardo Fort nació el 23 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Fue un empresario, productor de televisión y celebridad mediática argentina.
+Inicios y primeros años

-Inicios y carrera empresarial
+Ricardo Fort nació el 23 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza.

-Fort se inició en el mundo de los negocios a temprana edad, trabajando en la empresa familiar dedicada a la venta de artículos de limpieza. Posteriormente, se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial.
+Carrera empresarial y fama mediática

-Fama mediática
+En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante y su estilo de vida ostentoso. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino.

-A principios de la década de 2000, Fort comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante y su estilo de vida ostentoso. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial.
-
-Vida personal
+Vida personal y familia

Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica y los escándalos mediáticos.

Fallecimiento

-Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
+Lamentablemente, Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 556 | ], 557 | "text/plain": [ 558 | "" 559 | ] 560 | }, 561 | "metadata": {}, 562 | "output_type": "display_data" 563 | }, 564 | { 565 | "name": "stdout", 566 | "output_type": "stream", 567 | "text": [ 568 | "2024-04-11 17:45:25.583738 [INFO] Respuesta revisada: [1/2]\n", 569 | "[0/5] RESPUESTA REVISADA:\n", 570 | " Biografía Inicios y primeros años Ricardo Fort nació el 23 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante y su estilo de vida ostentoso. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica y los escándalos mediáticos. Fallecimiento Lamentablemente, Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.\n", 571 | "--------------------------------------------------------------------------------\n", 572 | "2024-04-11 17:45:25.583823 [INFO] Vamos a revisar la parte [2/5] ...\n", 573 | "[1/5] Respuesta original:\n", 574 | "Biografía Inicios y primeros años Ricardo Fort nació el 23 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante y su estilo de vida ostentoso. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica y los escándalos mediáticos. Fallecimiento Lamentablemente, Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática. `Ricardo Fort fue un empresario, productor de televisión y celebridad argentina muy conocida. Nació en 1968 en Buenos Aires, Argentina.\n", 575 | "2024-04-11 17:45:25.583857 [INFO] Generamos una 'query` que vamos a usar para buscar después ...\n", 576 | "2024-04-11 17:45:26.946801 - [INFO] La función get_query_wrapper completó su ejecución exitosamente.\n", 577 | ">>> 1/5 Query: \"Ricardo Fort\" \"lugar de nacimiento\" \"fecha de fallecimiento\"\n", 578 | "2024-04-11 17:45:26.947810 [INFO] Arrancamos a crawlear las páginas ...\n", 579 | "2024-04-11 17:45:56.975577 - [INFO] Timeout: La función get_content_wrapper excedió el tiempo de 30s.\n", 580 | "2024-04-11 17:45:56.980280 [INFO] Revisamos las respuestas contra las páginas ...[0/2]\n", 581 | "2024-04-11 17:46:04.461520 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 582 | ] 583 | }, 584 | { 585 | "data": { 586 | "text/html": [ 587 | "
--- text1
+++ text2
@@ -14,6 +14,4 @@

Fallecimiento

-Lamentablemente, Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
-
-`Ricardo Fort fue un empresario, productor de televisión y celebridad argentina muy conocida. Nació en 1968 en Buenos Aires, Argentina.
+Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 588 | ], 589 | "text/plain": [ 590 | "" 591 | ] 592 | }, 593 | "metadata": {}, 594 | "output_type": "display_data" 595 | }, 596 | { 597 | "name": "stdout", 598 | "output_type": "stream", 599 | "text": [ 600 | "2024-04-11 17:46:04.464796 [INFO] Respuesta revisada: [0/2]\n", 601 | "2024-04-11 17:46:04.464848 [INFO] Revisamos las respuestas contra las páginas ...[1/2]\n", 602 | "2024-04-11 17:46:16.423677 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 603 | ] 604 | }, 605 | { 606 | "data": { 607 | "text/html": [ 608 | "
--- text1
+++ text2
@@ -2,16 +2,16 @@

Inicios y primeros años

-Ricardo Fort nació el 23 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza.
+Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador.

Carrera empresarial y fama mediática

-En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante y su estilo de vida ostentoso. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino.
+En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino.

Vida personal y familia

-Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica y los escándalos mediáticos.
+Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas.

Fallecimiento

-Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
+Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 609 | ], 610 | "text/plain": [ 611 | "" 612 | ] 613 | }, 614 | "metadata": {}, 615 | "output_type": "display_data" 616 | }, 617 | { 618 | "name": "stdout", 619 | "output_type": "stream", 620 | "text": [ 621 | "2024-04-11 17:46:16.427044 [INFO] Respuesta revisada: [1/2]\n", 622 | "[1/5] RESPUESTA REVISADA:\n", 623 | " Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.\n", 624 | "--------------------------------------------------------------------------------\n", 625 | "2024-04-11 17:46:16.427132 [INFO] Vamos a revisar la parte [3/5] ...\n", 626 | "[2/5] Respuesta original:\n", 627 | "Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática. Fort se hizo famoso por su participación en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.\n", 628 | "2024-04-11 17:46:16.427164 [INFO] Generamos una 'query` que vamos a usar para buscar después ...\n", 629 | "2024-04-11 17:46:18.886481 - [INFO] La función get_query_wrapper completó su ejecución exitosamente.\n", 630 | ">>> 2/5 Query: ricardo fort cirugías plásticas obsesión apariencia joven\n", 631 | "2024-04-11 17:46:18.887454 [INFO] Arrancamos a crawlear las páginas ...\n", 632 | "2024-04-11 17:46:48.922183 - [INFO] Timeout: La función get_content_wrapper excedió el tiempo de 30s.\n", 633 | "2024-04-11 17:46:48.926988 [INFO] Revisamos las respuestas contra las páginas ...[0/2]\n", 634 | "2024-04-11 17:46:57.678670 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 635 | ] 636 | }, 637 | { 638 | "data": { 639 | "text/html": [ 640 | "
--- text1
+++ text2
@@ -6,14 +6,12 @@

Carrera empresarial y fama mediática

-En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino.
+En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica.

Vida personal y familia

-Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas.
+Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.

Fallecimiento

-Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
-
-Fort se hizo famoso por su participación en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.
+Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 641 | ], 642 | "text/plain": [ 643 | "" 644 | ] 645 | }, 646 | "metadata": {}, 647 | "output_type": "display_data" 648 | }, 649 | { 650 | "name": "stdout", 651 | "output_type": "stream", 652 | "text": [ 653 | "2024-04-11 17:46:57.682196 [INFO] Respuesta revisada: [0/2]\n", 654 | "2024-04-11 17:46:57.682246 [INFO] Revisamos las respuestas contra las páginas ...[1/2]\n", 655 | "2024-04-11 17:47:05.518723 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 656 | ] 657 | }, 658 | { 659 | "data": { 660 | "text/html": [], 661 | "text/plain": [ 662 | "" 663 | ] 664 | }, 665 | "metadata": {}, 666 | "output_type": "display_data" 667 | }, 668 | { 669 | "name": "stdout", 670 | "output_type": "stream", 671 | "text": [ 672 | "2024-04-11 17:47:05.521873 [INFO] Respuesta revisada: [1/2]\n", 673 | "[2/5] RESPUESTA REVISADA:\n", 674 | " Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.\n", 675 | "--------------------------------------------------------------------------------\n", 676 | "2024-04-11 17:47:05.521974 [INFO] Vamos a revisar la parte [4/5] ...\n", 677 | "[3/5] Respuesta original:\n", 678 | "Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática. A principios de la década de 2000, Fort fundó su propia productora de televisión y produjo varios programas exitosos. También incursionó en los negocios inmobiliarios y la venta de productos de belleza.\n", 679 | "2024-04-11 17:47:05.522009 [INFO] Generamos una 'query` que vamos a usar para buscar después ...\n", 680 | "2024-04-11 17:47:12.745515 - [INFO] La función get_query_wrapper completó su ejecución exitosamente.\n", 681 | ">>> 3/5 Query: ricardo fort empresas negocios productora televisión programas exitosos negocios inmobiliarios venta productos belleza\n", 682 | "2024-04-11 17:47:12.746519 [INFO] Arrancamos a crawlear las páginas ...\n", 683 | "2024-04-11 17:47:42.761835 - [INFO] Timeout: La función get_content_wrapper excedió el tiempo de 30s.\n", 684 | "2024-04-11 17:47:42.766542 [INFO] Revisamos las respuestas contra las páginas ...[0/2]\n", 685 | "2024-04-11 17:47:51.872939 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 686 | ] 687 | }, 688 | { 689 | "data": { 690 | "text/html": [ 691 | "
--- text1
+++ text2
@@ -8,12 +8,12 @@

En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica.

+A principios de la década de 2000, Fort fundó su propia productora de televisión y produjo varios programas exitosos. También incursionó en los negocios inmobiliarios y la venta de productos de belleza.
+
Vida personal y familia

Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.

Fallecimiento

-Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
-
-A principios de la década de 2000, Fort fundó su propia productora de televisión y produjo varios programas exitosos. También incursionó en los negocios inmobiliarios y la venta de productos de belleza.
+Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 692 | ], 693 | "text/plain": [ 694 | "" 695 | ] 696 | }, 697 | "metadata": {}, 698 | "output_type": "display_data" 699 | }, 700 | { 701 | "name": "stdout", 702 | "output_type": "stream", 703 | "text": [ 704 | "2024-04-11 17:47:51.876463 [INFO] Respuesta revisada: [0/2]\n", 705 | "2024-04-11 17:47:51.876513 [INFO] Revisamos las respuestas contra las páginas ...[1/2]\n", 706 | "2024-04-11 17:48:04.003869 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 707 | ] 708 | }, 709 | { 710 | "data": { 711 | "text/html": [ 712 | "
--- text1
+++ text2
@@ -6,9 +6,11 @@

Carrera empresarial y fama mediática

-En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica.
+En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. A mediados de la década de 2000, Fort fundó su propia productora de televisión, Filosofía Producciones, y produjo varios programas exitosos.

-A principios de la década de 2000, Fort fundó su propia productora de televisión y produjo varios programas exitosos. También incursionó en los negocios inmobiliarios y la venta de productos de belleza.
+Negocios y emprendimientos
+
+Además de su empresa de limpieza y su productora de televisión, Fort incursionó en los negocios inmobiliarios y la venta de productos de belleza. Lanzó su propia línea de cosméticos llamada \"Ricardo Fort Cosmetics\".

Vida personal y familia

" 713 | ], 714 | "text/plain": [ 715 | "" 716 | ] 717 | }, 718 | "metadata": {}, 719 | "output_type": "display_data" 720 | }, 721 | { 722 | "name": "stdout", 723 | "output_type": "stream", 724 | "text": [ 725 | "2024-04-11 17:48:04.007389 [INFO] Respuesta revisada: [1/2]\n", 726 | "[3/5] RESPUESTA REVISADA:\n", 727 | " Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. A mediados de la década de 2000, Fort fundó su propia productora de televisión, Filosofía Producciones, y produjo varios programas exitosos. Negocios y emprendimientos Además de su empresa de limpieza y su productora de televisión, Fort incursionó en los negocios inmobiliarios y la venta de productos de belleza. Lanzó su propia línea de cosméticos llamada \"Ricardo Fort Cosmetics\". Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.\n", 728 | "--------------------------------------------------------------------------------\n", 729 | "2024-04-11 17:48:04.007474 [INFO] Vamos a revisar la parte [5/5] ...\n", 730 | "[4/5] Respuesta original:\n", 731 | "Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. A mediados de la década de 2000, Fort fundó su propia productora de televisión, Filosofía Producciones, y produjo varios programas exitosos. Negocios y emprendimientos Además de su empresa de limpieza y su productora de televisión, Fort incursionó en los negocios inmobiliarios y la venta de productos de belleza. Lanzó su propia línea de cosméticos llamada \"Ricardo Fort Cosmetics\". Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática. Lamentablemente, Ricardo Fort falleció en 2013 a la edad de 45 años debido a una insuficiencia cardíaca y otras complicaciones de salud. Dejó atrás a sus dos hijos gemelos y un legado como una de las figuras más polémicas y excéntricas de la televisión argentina.`\n", 732 | "2024-04-11 17:48:04.007507 [INFO] Generamos una 'query` que vamos a usar para buscar después ...\n", 733 | "2024-04-11 17:48:05.478812 - [INFO] La función get_query_wrapper completó su ejecución exitosamente.\n", 734 | ">>> 4/5 Query: \"Ricardo Fort\" muerte edad complicaciones cirugía reducción estómago\n", 735 | "2024-04-11 17:48:05.479927 [INFO] Arrancamos a crawlear las páginas ...\n", 736 | "2024-04-11 17:48:35.514988 - [INFO] Timeout: La función get_content_wrapper excedió el tiempo de 30s.\n", 737 | "2024-04-11 17:48:35.519615 [INFO] Revisamos las respuestas contra las páginas ...[0/2]\n", 738 | "2024-04-11 17:48:45.840642 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 739 | ] 740 | }, 741 | { 742 | "data": { 743 | "text/html": [ 744 | "
--- text1
+++ text2
@@ -6,18 +6,16 @@

Carrera empresarial y fama mediática

-En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. A mediados de la década de 2000, Fort fundó su propia productora de televisión, Filosofía Producciones, y produjo varios programas exitosos.
+En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica.

Negocios y emprendimientos

-Además de su empresa de limpieza y su productora de televisión, Fort incursionó en los negocios inmobiliarios y la venta de productos de belleza. Lanzó su propia línea de cosméticos llamada \"Ricardo Fort Cosmetics\".
+A mediados de la década de 2000, Fort fundó su propia productora de televisión, Filosofía Producciones, y produjo varios programas exitosos. Además de su empresa de limpieza y su productora de televisión, Fort incursionó en los negocios inmobiliarios y la venta de productos de belleza. Lanzó su propia línea de cosméticos llamada \"Ricardo Fort Cosmetics\".

Vida personal y familia

-Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.
+Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos gemelos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven.

Fallecimiento

-Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una complicación derivada de una intervención quirúrgica de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
-
-Lamentablemente, Ricardo Fort falleció en 2013 a la edad de 45 años debido a una insuficiencia cardíaca y otras complicaciones de salud. Dejó atrás a sus dos hijos gemelos y un legado como una de las figuras más polémicas y excéntricas de la televisión argentina.`
+Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una insuficiencia cardíaca y otras complicaciones derivadas de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.
" 745 | ], 746 | "text/plain": [ 747 | "" 748 | ] 749 | }, 750 | "metadata": {}, 751 | "output_type": "display_data" 752 | }, 753 | { 754 | "name": "stdout", 755 | "output_type": "stream", 756 | "text": [ 757 | "2024-04-11 17:48:45.844433 [INFO] Respuesta revisada: [0/2]\n", 758 | "2024-04-11 17:48:45.844484 [INFO] Revisamos las respuestas contra las páginas ...[1/2]\n", 759 | "2024-04-11 17:48:55.738995 - [INFO] La función get_revise_answer_wrapper completó su ejecución exitosamente.\n" 760 | ] 761 | }, 762 | { 763 | "data": { 764 | "text/html": [], 765 | "text/plain": [ 766 | "" 767 | ] 768 | }, 769 | "metadata": {}, 770 | "output_type": "display_data" 771 | }, 772 | { 773 | "name": "stdout", 774 | "output_type": "stream", 775 | "text": [ 776 | "2024-04-11 17:48:55.742298 [INFO] Respuesta revisada: [1/2]\n", 777 | "[4/5] RESPUESTA REVISADA:\n", 778 | " Biografía Inicios y primeros años Ricardo Fort nació el 5 de noviembre de 1968 en Venado Tuerto, provincia de Santa Fe, Argentina. Desde muy joven, se involucró en los negocios familiares dedicados a la venta de artículos de limpieza y productos de tocador. Carrera empresarial y fama mediática En la década de 1990, Fort se mudó a Buenos Aires y fundó su propia empresa de limpieza llamada \"Ricardo Fort S.A.\", la cual se convirtió en un éxito comercial. A principios de la década de 2000, comenzó a aparecer en programas de televisión, donde se destacó por su personalidad extravagante, su estilo de vida ostentoso y su gusto por las cirugías estéticas. Su fama creció rápidamente, convirtiéndose en un personaje polémico y controversial en el mundo del espectáculo argentino. Participó en varios reality shows y programas de televisión, donde mostraba su extravagante estilo de vida y personalidad excéntrica. Negocios y emprendimientos A mediados de la década de 2000, Fort fundó su propia productora de televisión, Filosofía Producciones, y produjo varios programas exitosos. Además de su empresa de limpieza y su productora de televisión, Fort incursionó en los negocios inmobiliarios y la venta de productos de belleza. Lanzó su propia línea de cosméticos llamada \"Ricardo Fort Cosmetics\". Vida personal y familia Fort se casó en dos ocasiones, primero con Gustavo Martínez y luego con Marisa Bello. Tuvo dos hijos gemelos, Felipito y Martita, fruto de su relación con Marisa Bello. Su vida personal estuvo marcada por la polémica, los escándalos mediáticos y su gusto por las cirugías estéticas. Fue conocido por su amor por las cirugías plásticas y su obsesión por mantener una apariencia joven. Fallecimiento Ricardo Fort falleció el 25 de noviembre de 2013 a los 45 años de edad en Buenos Aires, Argentina, debido a una insuficiencia cardíaca y otras complicaciones derivadas de una cirugía de reducción de estómago. Su muerte conmocionó al mundo del espectáculo argentino y generó una gran cobertura mediática.\n" 779 | ] 780 | } 781 | ], 782 | "source": [ 783 | "draft, answer = rat(\"Contame de la vida de Ricardo Fort\")" 784 | ] 785 | }, 786 | { 787 | "cell_type": "code", 788 | "execution_count": 12, 789 | "metadata": {}, 790 | "outputs": [ 791 | { 792 | "data": { 793 | "text/html": [ 794 | "
--- text1
+++ text2
@@ -1,3 +1,5 @@
+
+
Aquí están mis pensamientos paso a paso sobre la vida de Ricardo Fort:

`Ricardo Fort fue un empresario, productor de televisión y celebridad argentina muy conocida. Nació en 1968 en Buenos Aires, Argentina.
" 795 | ], 796 | "text/plain": [ 797 | "" 798 | ] 799 | }, 800 | "metadata": {}, 801 | "output_type": "display_data" 802 | } 803 | ], 804 | "source": [ 805 | "diff_html = generate_diff_html(draft, answer)\n", 806 | "display(HTML(diff_html))" 807 | ] 808 | }, 809 | { 810 | "cell_type": "markdown", 811 | "metadata": {}, 812 | "source": [ 813 | "---" 814 | ] 815 | }, 816 | { 817 | "cell_type": "markdown", 818 | "metadata": { 819 | "tags": [] 820 | }, 821 | "source": [ 822 | "# Gradio Demo" 823 | ] 824 | }, 825 | { 826 | "cell_type": "code", 827 | "execution_count": null, 828 | "metadata": { 829 | "tags": [] 830 | }, 831 | "outputs": [], 832 | "source": [ 833 | "# %%capture\n", 834 | "# !pip install gradio --upgrade" 835 | ] 836 | }, 837 | { 838 | "cell_type": "code", 839 | "execution_count": null, 840 | "metadata": { 841 | "id": "BGeb6Q9FZnq8" 842 | }, 843 | "outputs": [], 844 | "source": [ 845 | "def predict(message, history):\n", 846 | " # rat function?\n", 847 | " draft, answer = rat(message)\n", 848 | " return answer" 849 | ] 850 | }, 851 | { 852 | "cell_type": "code", 853 | "execution_count": null, 854 | "metadata": { 855 | "colab": { 856 | "background_save": true, 857 | "base_uri": "https://localhost:8080/", 858 | "height": 1000 859 | }, 860 | "id": "YnFyowIFYtzE", 861 | "outputId": "3d2b8b2c-b118-4a5b-bf90-3a50f4f7fb56" 862 | }, 863 | "outputs": [], 864 | "source": [ 865 | "# Fast ChatBot demo\n", 866 | "import gradio as gr\n", 867 | "gr.ChatInterface(predict).launch(share=True, inline=False, debug=True)" 868 | ] 869 | } 870 | ], 871 | "metadata": { 872 | "colab": { 873 | "provenance": [], 874 | "toc_visible": true 875 | }, 876 | "kernelspec": { 877 | "display_name": "conda_pytorch_p310", 878 | "language": "python", 879 | "name": "conda_pytorch_p310" 880 | }, 881 | "language_info": { 882 | "codemirror_mode": { 883 | "name": "ipython", 884 | "version": 3 885 | }, 886 | "file_extension": ".py", 887 | "mimetype": "text/x-python", 888 | "name": "python", 889 | "nbconvert_exporter": "python", 890 | "pygments_lexer": "ipython3", 891 | "version": "3.10.13" 892 | } 893 | }, 894 | "nbformat": 4, 895 | "nbformat_minor": 4 896 | } 897 | --------------------------------------------------------------------------------