美文网首页
如何更好地向 ChatGPT 提问?

如何更好地向 ChatGPT 提问?

作者: iyangxuqing | 来源:发表于2023-02-12 14:29 被阅读0次

    作者:Yammi大魔王
    链接:https://www.zhihu.com/question/570765297/answer/2880002250
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    下文将以一个具体的示例来展示如何更好地提问,在此之前要说明的是

    1. 你的提问最好是聚焦在某个具体问题。太开放性的问题事实上本身可能无解,也不具备太现实的意义;
    2. 如果你要解决的问题,你自身对其已有大致的解决思路(基于现存已知的技术或方案),只是在专业度方面不够,chatGPT的回答会使你收益最大化。如果你本身并不明白问题要如何解决,只是提了个知识型的提问,那么收益会小得多。如果你的提问几乎没什么现实案例,那么你只能把期待降到最低;
    3. 经我实践验证,chatGPT比较擅长解决的问题有2大类,一类是清晰结构化的问题,例如写代码、如何做一件常规的事,另一类是框架清晰,只需要它填充细节,并且你对细节有明确要求的事务。其实第一类是第二类的子集,总体来说,用好chatGPT的前提是你有框架;
    4. 我接下来演示一下如何用chatGPT解决一个具体问题。

    这是我最近向chatGPT问过的问题,大部分都是技术问题,只有一个是我和chatGPT共创一本科幻小说的世界观

    用一个最常见的问题举例吧,电商类的。没有太大的实际用途,但好在大家都懂这个场景。

    我家的电热水壶用了5年,昨天短路了,我需要买个新的,但是我没空自己去比价格,所以我决定写一个Python程序,让它替我自动找各种电热水壶商品然后比价。——现实中我不会这么干的,我直接去小米线下店买一个小米电热水壶2.0。

    好,首先你需要设计一个实现的方案。我们俗称执行路径。
    在此之前,你得知道一个现状,那就是别太指望用爬虫的方式去抓取电商的数据,基本上电商现在都禁止爬虫了。

    所以我们的执行路径依赖于RPA这种思路,也就是创造一个机器人模拟你做这件事儿的动作,这种思路最直观、最好理解、也最容易表达。

    所以做这件事的步骤如下——以下步骤我们的原则是不要试图使用最牛逼的技术,而是使用最直观的技术,毕竟,你可能也不太懂技术,那么用牛逼的技术,你可能很难验证是否做对了——另外,我也不懂牛逼的技术(这是关键)

    1. 打开一个浏览器,并使其打开taobao.com页面;

    2. 等待你输入账号密码登录——机器人也可以登录,但容易被验证——登陆后,你得给机器人一个信号,让它知道它可以替代你进行接下来的动作了,比如,你可以设定一个键盘输入让它理解这个事儿;

    3. 让它按照你的要求来查询商品,你需要向它提供一个商品名称;

    4. 接下来就是机器人的自动循环,它要做的是3件事:

    5. 搜索商品

    6. 按照 taobao搜索结果页的html特征捕获具体的商品

    7. 点进去,存储商品信息

    8. 最后要设定一个比价逻辑,比如单纯比价格或者按每单位容量的价格衡量,把最佳结果打印出来(或者其他方式显示给你)


    from selenium import webdriver

    # create a new Chrome browser instance
    browser = webdriver.Chrome()

    # navigate to taobao.com
    browser.get('https://www.taobao.com')

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC

    # create a new Chrome browser instance
    browser = webdriver.Chrome()

    # navigate to taobao.com
    browser.get('https://www.taobao.com')

    # wait until the login button appears
    xpath = "/html/body/div[3]/div[2]/div[2]/div[2]/div[5]/div/div[2]/div[1]/a[1]"
    WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))

    # the login button has appeared, so we can now access it
    login_button = browser.find_element_by_xpath(xpath)

    注意,在深入提问的过程,因为需求逐渐细化,chatGPT会不断调整此前的代码,甚至用一种新的模块或书写方法重写。一般来说无关紧要,重要的还是自己能看懂代码逻辑。

    # click the login button to enter the login page
    login_button.click()

    获取登录输入框的XPath,然后让程序等待这个Xpath出现,说明页面加载完毕。

    # wait until the login page appears
    xpath = "//*[@id='fm-login-id']"
    WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))

    # the login page has appeared, so we can now access elements on the page
    username_field = browser.find_element_by_xpath(xpath)

    实际上因为我们计划手动输入账号密码,所以上述代码中的username_field值并不需要,可以去掉。

    from selenium.webdriver.common.action_chains import ActionChains
    import keyboard

    def wait_for_hotkey():
    keyboard.wait('ctrl+F7')
    return

    action = ActionChains(browser)
    action.key_down(Keys.CONTROL).key_down('F7').key_up('F7').key_up(Keys.CONTROL)
    action.perform()

    # wait for the hotkey
    wait_for_hotkey()

    为了格式好看一些,import相关的代码可以放到最上面去。其他的放在上述代码后面也ok。

    接下来要开始搜索和查询商品了。

    这时候应该已经完成了登录,应该让程序去找到搜索框。

    # wait for the search field to appear
    search_field = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.XPATH, "//*[@id='q']"))
    )

    # enter the search text
    search_field.send_keys("电热水壶")

    由于代码里用到的库,上面已经引用了,所以这里的代码不需要再包含这些库。

    search_button = browser.find_element_by_xpath("//*[@id='J_TSearchForm']/div[1]/button")
    search_button.click()

    虽然chatGPT像个奶妈一样无微不至地提醒你代码运行可能出现的错误,并给了第二套解决方案,但敬谢了,我们直接用第一段就好。

    好了,前面都还比较简单,这里出现重复区域了,我们应该怎么逐个点击对应的商品并获得它们的相应信息呢?

    我假装也不知道,然后我们问问chatGPT吧。

    这次,chatGPT仿佛是搞懂了你到底想要干什么,于是把整个代码全都重写了一遍(因为前面我们没有要求它处理登录的部分,所以它并不知道这部分的内容,因此没有登陆相关的动作)。

    所以我们有选择地筛选一下代码内容。

    # wait for the search results to load
    search_results = WebDriverWait(browser, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".J_ItemPic.img"))
    )

    # loop through each featured image
    for img in search_results:
    img.click()
    # wait for the item page to load and do something with the page
    item_page = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "J_DetailMeta"))
    )
    # do something with the item page
    # ...
    browser.back()

    然后我们要开始获得商品的标题、SKU参数(一般就是颜色款式之类的内容)

    这部分代码其实应该是前面那段循环代码中的一部分,因此要放到前面那段里,我们重组一下

    # wait for the search results to load
    search_results = WebDriverWait(browser, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".J_ItemPic.img"))
    )

    # loop through each featured image
    for img in search_results:
    img.click()
    # wait for the item page to load and do something with the page
    item_page = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "J_DetailMeta"))
    )
    # do something with the item page

    title_xpath = "//*[@id='root']/div/div[2]/div[2]/div[1]/div/div[2]/div[1]/h1"
    price_class = "skuValueName"
    price_xpath1 = "//*[@id='root']/div/div[2]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/span[3]"
    price_xpath2 = "//*[@id='root']/div/div[2]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div/div[2]/span[3]"
    title_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, title_xpath)))
    price_elements = driver.find_elements_by_class_name(price_class)
    for price_element in price_elements:
        try:
            span_text = price_element.text
            price1_element = driver.find_element_by_xpath(price_xpath1)
            price1 = int(price1_element.text)
            price2_element = driver.find_element_by_xpath(price_xpath2)
            price2 = int(price2_element.text)
            price = min(price1, price2)
            print("Title:", title_element.text, "Price:", price, "Span Text:", span_text)
        except:
            print("Failed to find the prices for Span Text:", span_text)
    browser.back()
    

    到此为止,整个商品查价格的动作就完成了(其实漏了一步,没有把标题、款式、价格和链接这些信息保存下来,不过作为示例这些就不重要了)。


    通过上述的过程,可以看出chatGPT的强大,以及应该如何从chatGPT挖掘最佳的答案。

    chatGPT并不是绝对的神器,不要认为强AI的时代已经来了,远远没有!现在的chatGPT还远远无法做到“言出法随”,它只是人类过去所积累的知识、通过互联网这种载体、存储下来的那部分的精华和集大成者。

    但是人+AI协作,即将大幅提高某些领域的生产效率,这一点是毋庸置疑的。


    早点学会如何使用这种强大的人机协作工具,就早点掌握下一代技术致富的密码。否则,就像我所担忧的那样:

    chatGPT究竟在改变什么?也许贫瘠的人会更贫瘠

    相关文章

      网友评论

          本文标题:如何更好地向 ChatGPT 提问?

          本文链接:https://www.haomeiwen.com/subject/rpddkdtx.html