刚出GPT 4时候就开始用了,现在应该快两年了吧。从一个研究生的角度,我来讲讲我平时是怎么用ChatGPT的吧。先从科研角度来讲吧,后续有空慢慢更新其他的。如果大家觉得有什么更好的用法,可以一起分享。
1. 快速阅读论文
一般读论文,我会先肉眼扫一眼看摘要,决定要不要继续深入。如果要继续深入看的话,我还会再选择GPT来迅速了解全文内容。一般而言我用的提示词如下:请从摘要、研究背景、难点与调整、贡献、方法以及实验等角度详细介绍一下这篇论文。下面是这篇论文的内容:
「论文内容」 内容我一般是直接复制整个PDF的内容,而不是上传文件(因为就我个人的使用的经验来看,相比于复制内容,直接上传回答的效果没那么好)。根据GPT的回答,如果我对哪部分内容感兴趣,我会继续追问某一部分的细节,比如"论文中方法部分用的是什么架构的编码器?"。
但是这其中往往会遇到一些问题,比如当你问到的细节涉及到论文的一些公式时候,直接复制pdf的公式会很乱(不过简单的公式貌似gpt也能识别),这时候就需要使用到下面的公式识别的神器了Mathpix: Snip Apps ,只需要截图就可以识别。识别后告诉GPT就可以了,这样下来GPT就能很好的理解公式了。上面的这个工具普通邮箱注册的一个月只有10次,教育邮箱注册的一个月可以有20次。
2. 快速调研一个领域
我们导师经常叫我们去调研新的领域,但是文献太多了,想要短时间内调研清楚一个领域确实很难,尤其是最前沿的领域。所以我写了一个脚本爬取arxiv大概100篇的论文摘要,然后用GPT3.5的API总结翻译摘要,最后送入网页版GPT 4给我写一篇综述。实测体验还不错,虽然有些论文引文对应不上,但是可以通过不断调教,不断优化提示来达到最终的目的。
爬取论文摘要的代码是用selenium浏览器实现的,通过点击arxiv网站的more显示所有摘要,然后使用xpath匹配。代码比较简单,如下:- import pandas as pd
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.chrome.options import Options
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- # 创建ChromeOptions对象
- options = Options()
- # 启用无头模式
- # options.add_argument("--headless")
- # 启用无痕模式
- options.add_argument("--incognito")
- options.add_argument("--disable-domain-reliability")
- options.add_argument("--disable-blink-features=AutomationControlled")
- options.add_argument("--disable-client-side-phishing-detection")
- options.add_argument("--no-first-run")
- options.add_argument("--use-fake-device-for-media-stream")
- options.add_argument("--autoplay-policy=user-gesture-required")
- options.add_argument("--disable-features=ScriptStreaming")
- options.add_argument("--disable-notifications")
- options.add_argument("--disable-popup-blocking")
- options.add_argument("--disable-save-password-bubble")
- options.add_argument("--mute-audio")
- options.add_argument("--no-sandbox")
- options.add_argument("--disable-gpu")
- options.add_argument("--disable-extensions")
- options.add_argument("--disable-software-rasterizer")
- options.add_argument("--disable-dev-shm-usage")
- options.add_argument("--disable-webgl")
- options.add_argument("--allow-running-insecure-content")
- options.add_argument("--no-default-browser-check")
- options.add_argument("--disable-full-form-autofill-ios")
- options.add_argument("--disable-autofill-keyboard-accessory-view[8]")
- options.add_argument("--disable-single-click-autofill")
- options.add_argument("--ignore-certificate-errors")
- options.add_argument("--disable-infobars")
- options.add_argument("--disable-blink-features=AutomationControlled")
- options.add_argument("--disable-blink-features")
- # 禁用实验性QUIC协议
- options.add_experimental_option("excludeSwitches", ["enable-quic"])
- # 创建Chrksome浏览器实例
- driver = webdriver.Chrome(options=options, )
- key_words = ''
- url = "https://arxiv.org/search/?searchtype=all&query={}&abstracts=show&size=100&order=-announced_date_first".format(
- key_words.replace(' ', '+')
- )
- try:
- driver.get(url)
- # print(driver.page_source)
- WebDriverWait(driver, 100000).until(
- EC.presence_of_element_located((By.XPATH, '//span[@class="abstract-full has-text-grey-dark mathjax"]'))
- )
- # 定位到展开按钮并点击
- expand_buttons = driver.find_elements(By.XPATH,
- '//a[contains(@class, "is-size-7") and contains(@style, "white-space: nowrap;")]')
- for i, expand_button in enumerate(expand_buttons):
- if i % 2 == 0:
- # print(i, expand_button.text)
- expand_button.click()
- # print(driver.page_source)
- # xpath 匹配abstract-short has-text-grey-dark mathjax的div标签
- elements_abstract = driver.find_elements(By.XPATH, '//span[@class="abstract-full has-text-grey-dark mathjax"]')
- elements_title = driver.find_elements(By.XPATH, '//p[@class="title is-5 mathjax"]')
- elements_link = driver.find_elements(By.XPATH, '//p[@class="list-title is-inline-block"]/a')
- titles = []
- abstracts = []
- links = []
- for i, element in enumerate(elements_abstract):
- title = elements_title[i].text
- link = elements_link[i].get_attribute('href')
- abstract = f"{i + 1}. " + elements_abstract[i].text + '\n'
- titles.append(title)
- abstracts.append(abstract[:-6])
- links.append(link)
- # 保存为df
- df = pd.DataFrame({'title': titles, 'abstract': abstracts, 'link': links})
- df.to_csv('./out/{}.csv'.format(key_words), index=False)
- except Exception as e:
- # 停止脚本时关闭浏览器
- print(e)
- driver.quit()
复制代码 key_words需要修改为你的搜索词。由于网页版GPT4的上下午限制,爬取完摘要后需要对摘要进行压缩。用以下代码请求GPT3.5的API接口翻译摘要或者总结摘要。这里的prompt可以自行修改,如果总的论文数目比较少,可以让摘要详细点,就让它直接翻译成中文而不用总结压缩字数。- import json
- from concurrent.futures import ThreadPoolExecutor
- import numpy as np
- import pandas as pd
- from Models.GPT import GPT
- with open('Models/gpt3.5_config_oneapi.json', 'r') as f:
- s = f.read()
- conf = json.loads(s)
- conf['model'] = 'gpt-3.5-turbo'
- gpt = GPT(conf)
- key_words = 'privacy leakage LLMs prompt'
- df = pd.read_csv(f"./out/{key_words}.csv") # title,abstract,link
- prompt = "下面是一篇论文的摘要:用中文一句话描述它使用的核心方法。下面是摘要{}"
- abstract_list = df['abstract'].tolist()
- with ThreadPoolExecutor(max_workers=16) as executor:
- results = list(executor.map(lambda abstract: gpt.query(prompt.format(abstract), max_tokens=4096), abstract_list))
- results = [result['choices'][0]['message']['content'] for result in results]
- df['abstract_summary'] = results
- df.to_csv(f"./out/{key_words}_summary.csv", index=False, encoding='utf-8-sig')
复制代码 最后复制./out/{key_words}_summary.csv这个文件中的abstract_summary这一列扔给GPT4让他写一个综述,同时让他注意标注引文序号。 |
|