前置准备

一个谷歌账号

由于本项目调用的是谷歌浏览器的接口,所以必须要申请一个谷歌账号

一个chatgpt的API key

这个可点击获取API key这个链接,登录对应的gpt账号即刻获取。 点击里面的Create new secret key即可新建, 记得新建的key一定要保存好,他只能在新建时查看一次,以后就再也不能查看的,忘记的就只能再新建一个

具体页面如下:
在这里插入图片描述

python环境

python环境最低要求必须支持langchain框架,
需要用到的库有,langchain, request, re, bs4等

设置谷歌Json API

首先,我们调用谷歌搜索的api需要用到两个变量,一个是谷歌搜索引擎的API key,另一个自定义搜索引擎的ID
接下来我将说明如何获取这两个值

首先是谷歌的API key
点击这个链接,进入谷歌的API服务中心,然后新建一个项目,这里点击上面的web service,这个是我创建的项目的名字,正常情况为空,可以自己创建一个项目
在这里插入图片描述
在这里插入图片描述
这里名字随便写,然后创建

接着,点击左侧的库,搜索Custom Search JSON API在这里插入图片描述

进入Custom Search JSON API页面,并点击启用
在这里插入图片描述
之后回到开始页面,点击左侧的凭证,然后点击“创建凭据”并选择“API 密钥”。
在这里插入图片描述
在这里插入图片描述
这时候就能获取你谷歌的API key了
在这里插入图片描述
得到后先把它保存下来,接着我们获取个人引擎的ID

访问可编程搜索引擎管理页面,创建一个新的搜索引擎或选择一个现有的搜索引擎。在搜索引擎设置页面中,找到“搜索引擎ID”并复制它
在这里插入图片描述
这里记得创建时要选择在整个网络中搜索

创建后点击这个引擎,一进去就可以看见你的ID了
在这里插入图片描述
获取这两个后就可以开始我们代码编写了,需要注意的是,这个谷歌的JSON API 每天只有100次免费调用的额度,超过需要收费,调用需求大的可以考虑多建立几个谷歌账号,获取它们对应的ID和key然后循环使用

编写代码

我们整个代码的思路为:
用户输入问题->调用gpt接口过滤一些无关信息->调用谷歌搜索引擎->得到对应的标题和网站->采用爬虫获取对应的内容->调用gpt接口回答问题

配置环境变量

在这里设置你的代理

import os
os.environ['HTTP_PROXY'] = "127.0.0.1:you proxy port"
os.environ['HTTPS_PROXY']="127.0.0.1:you proxy port"

调用gpt接口来过滤信息

def fitter_inner(query):
    # 配置环境变量
    import os
    os.environ['HTTP_PROXY'] = "127.0.0.1:you proxy port"
    os.environ['HTTPS_PROXY']="127.0.0.1:you proxy port"
    os.environ["OPENAI_API_KEY"]="you-api-key"

    # 定义聊天模板
    from langchain.prompts import ChatPromptTemplate
    prompts ="""
    你现在是一个问题提取机器人,现在我会给你一段文本,这段文本是用户输入给你的内容,这段内容可能会有一些混淆
    的信息,你要做的就是提取里面可能需要联网才能查询到的信息出来,并且返回......(后面自己完善,建议加点例子)

	(这一部分如果你懂langchain框架,可以自行修改,不懂建议不要改)
    接下来是用户输入的内容:
    {query}

    返回格式为:
    {response_schemas}
    """
    ChatPrompt = ChatPromptTemplate.from_template(prompts)


    # 定义返回格式
    from langchain.output_parsers import ResponseSchema
    from langchain.output_parsers import StructuredOutputParser
	
    result_schema = ResponseSchema(name='result',
                                   description="返回一个字符串,这个字符串表示的是真正需要联网的功能")
    response_schemas = [result_schema]
    out_parse = StructuredOutputParser(response_schemas=response_schemas)
    format_instructions = out_parse.get_format_instructions() # format_instructions就是我们的格式


    # 定义gpt模型和生成链
    from langchain.chat_models import ChatOpenAI
    from langchain.chains import LLMChain

    llm = ChatOpenAI(model_name="gpt-3.5-turbo-16k", temperature=0)
    chain = LLMChain(llm=llm, prompt=ChatPrompt)

    # 调用链
    result = chain.run(query=query, response_schemas=format_instructions)
    return out_parse.parse(result)

调用方法为:

question = """
123+ee42
广东天气怎样
"""
query = fitter_inner(question)
print(query)

这里的query返回值应该是一个json数据格式,你想获取直接的值的话,可通过query[‘result’]来获取

配置谷歌浏览器接口变量



# Google搜索函数
def google_search():
    # 你的API密钥和自定义搜索引擎ID
    api_key = "之前获取的谷歌API key"
    cse_id = "之前获取的个人搜索引擎key"

    
    url = "https://www.googleapis.com/customsearch/v1"
    params = {
        "q": query,
        "key": api_key,
        "cx": cse_id
    }
    response = requests.get(url, params=params)
    return response.json()

通过这个json接口返回的是一个带有浏览器搜索的一个标题和链接,如下图
在这里插入图片描述

通过爬虫获取信息

接下来就要提取这些信息,并通过爬虫获取这些信息

    def extract_content(self, query):
    	#这里调用了上面的谷歌接口
        results = self.google_search(query)
        inner = []
        # 提取指定数量的链接的信息
        for item in results["items"][:self.num_links]:
            url = item['link']

            try:
                timeout_seconds = 10
                # 使用requests库获取链接的内容,并设置超时时间
                response = requests.get(url, timeout=self.timeout_seconds)

                # 检查是否成功获取
                if response.status_code == 200:
                    # 获取字符编码
                    encoding = response.encoding if 'charset' in response.headers.get('content-type', '').lower() else None

                    # 使用BeautifulSoup解析HTML
                    soup = BeautifulSoup(response.content, 'html.parser', from_encoding=encoding)

                    # 使用get_text()方法提取所有文本内容
                    text_content = soup.get_text()
                    # 对文本进行加工处理
                    cleaned_text = self.clean_text(text_content)
                    inner.append(cleaned_text)
                    # 打印提取的文本内容
                else:
                    print(f"无法访问网页:{url}")
            except requests.Timeout:
                print(f"请求超时,超过了{self.timeout_seconds}秒的等待时间。链接:{url}")

        return inner
    def clean_text(self, text):
        # 使用正则表达式替换连续的空白字符为单个空格
        return re.sub(r'\s+', ' ', text).strip()

这样就能获取全部的内容了,如果考虑到gpt的api接口可能会有tokens限制,可以自行修改代码,让他能够人为的进行控制,具体代码我稍后会发在另一篇文章中

将获取的信息输入给gpt

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
os.environ["OPENAI_API_KEY"]="you-api-key"

llm = ChatOpenAI(temperature=0.7, model_name='gpt-3.5-turbo-16k')
prompt = """
    现在你是一个问答机器人,我会给你一段来自互联网的文本,你根据这段文本和用户的问题来进行回答,如果文本提供的内容回答不了用户的问题,那么则回答我无法提供正确的回答
    网络资料:
    ------------------------------------------
    {inner}

    -------------------------------------------
    用户问题:
    --------------------------------------------
    {question}
    ---------------------------------------------
"""
prompts = PromptTemplate.from_template(prompt)
chain = LLMChain(llm=llm, prompt = prompts)
print(chain.run(question=query, inner = '\n'.join(inner)))

最后就可以得到结果:
在这里插入图片描述

完整代码

import requests
import re
from bs4 import BeautifulSoup
import time

class GoogleSearchExtractor:
    def __init__(self, api_key, cse_id, num_links=3, timeout_seconds=10):
        self.api_key = api_key
        self.cse_id = cse_id
        self.num_links = num_links
        self.timeout_seconds = timeout_seconds

    def google_search(self, query):
        url = "https://www.googleapis.com/customsearch/v1"
        params = {
            "q": query,
            "key": self.api_key,
            "cx": self.cse_id
        }
        response = requests.get(url, params=params)
        return response.json()

    def clean_text(self, text):
        # 使用正则表达式替换连续的空白字符为单个空格
        return re.sub(r'\s+', ' ', text).strip()

    def extract_content(self, query):
        results = self.google_search(query)
        inner = []
        # 提取指定数量的链接的信息
        for item in results["items"][:self.num_links]:
            url = item['link']

            try:
                # 使用requests库获取链接的内容,并设置超时时间
                response = requests.get(url, timeout=self.timeout_seconds)

                # 检查是否成功获取
                if response.status_code == 200:
                    # 获取字符编码
                    encoding = response.encoding if 'charset' in response.headers.get('content-type', '').lower() else None

                    # 使用BeautifulSoup解析HTML
                    soup = BeautifulSoup(response.content, 'html.parser', from_encoding=encoding)

                    # 使用get_text()方法提取所有文本内容
                    text_content = soup.get_text()
                    # 清理文本
                    cleaned_text = self.clean_text(text_content)
                    inner.append(cleaned_text)
                    # 打印提取的文本内容
                else:
                    print(f"无法访问网页:{url}")
            except requests.Timeout:
                print(f"请求超时,超过了{self.timeout_seconds}秒的等待时间。链接:{url}")

        return inner

# 使用示例
api_key = ""
cse_id = ""
query = "今天广东天气怎样"

extractor = GoogleSearchExtractor(api_key, cse_id)
inner = extractor.extract_content(query)

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
import os

os.environ["OPENAI_API_KEY"]="you-api-key"
llm = ChatOpenAI(temperature=0.7, model_name='gpt-3.5-turbo-16k')
prompt = """
    现在你是一个问答机器人,我会给你一段来自互联网的文本,你根据这段文本和用户的问题来进行回答,如果文本提供的内容回答不了用户的问题,那么则回答我无法提供正确的回答
    网络资料:
    ------------------------------------------
    {inner}

    -------------------------------------------
    用户问题:
    --------------------------------------------
    {question}
    ---------------------------------------------
"""
prompts = PromptTemplate.from_template(prompt)
chain = LLMChain(llm=llm, prompt = prompts)
print(chain.run(question=query, inner = '\n'.join(inner)))

这个是不调用过滤的情况下,如果需要过滤的话,请自行将上面处理过滤信息的代码添加进去

以上就是利用python实现chatgpt联网功能的代码了,如果有好的建议欢迎在评论区留言

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐