使用 Python 制作一个属于自己的 AI 搜索引擎

news2024/12/25 12:34:30

1. 使用到技术

  1. OpenAI KEY
  2. Serper KEY
  3. Bing Search

2. 原理解析

使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。

3. 代码实现

import requests
from lxml import etree
import os
from openai import OpenAI

# 从环境变量中加载 API 密钥
os.environ["OPENAI_API_KEY"] = "sk-xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
os.environ["SERPER_API_KEY"] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 确保在执行代码前已经设置了环境变量
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
SERPER_API_KEY = os.getenv("SERPER_API_KEY")

def search_bing(query):
    headers = {
        'Referer': 'https://www.bing.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
    }
    params = {
        'q': query,
        'mkt': 'zh-CN'
    }

    response = requests.get('https://www.bing.com/search', params=params, headers=headers)

    html = etree.HTML(response.text)

    li_list = html.xpath("//li[@class='b_algo']")

    result = []

    for index in range(len(li_list)):
        title = ";".join(li_list[index].xpath("./h2/a/text()"))
        link = li_list[index].xpath("./h2/a/@href")[0]
        snippet = ";".join(li_list[index].xpath("./div/p/text()"))
        position = index
        print(title, link, snippet, position)
        result.append({
            'title': title,
            'link': link,
            'snippet': snippet,
            'position': position,
        })
    return result

def search_serper(query):
    """使用Serper API进行搜索并返回结果。"""
    url = "https://google.serper.dev/search"
    headers = {
        "X-API-KEY": SERPER_API_KEY,
        "Content-Type": "application/json",
    }
    params = {
        'q': query,
        'gl': "cn",
        'hl': "zh-cn",
    }

    try:
        response = requests.post(url, headers=headers, json=params)
        response.raise_for_status()  # 检查HTTP请求状态
        serper_data = response.json()
        if not serper_data:
            return "无法获取搜索结果", []
        google_context = serper_data.get('organic', [])
        google_other = serper_data.get('relatedSearches', [])
        return google_context, google_other
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

def search_openai(query, context):
    """利用OpenAI API回答问题并引用相关上下文,并使用流的方式输出。"""
    context_template = (
        "你是GinLynn构建的大型语言AI助手。给你一个用户问题,请正确、简洁、准确的讲述这个问题的答案。"
        "你会得到一组与问题相关的上下文,其中每个对象都是一个json字符串,"
        "'snippet'字段表示片段,'title'字段表示标题,'link'字段表示链接,'position'字段表示位置。"
        "请使用这些上下文并在每个句子的末尾引用上下文(如果适用)。"
        "你的答案必须是正确、准确的,由专家以公正和专业的语气撰写。请限制为2048token。"
        "不要给出任何与问题无关的信息,也不要重复。如果给定的上下文没有提供足够的信息,"
        "那么在相关主题后面加上“information is missing on”。请以[position]的格式注明出处和参考编号。"
        "以下是一组上下文:"
    )

    client = OpenAI(api_key=OPENAI_API_KEY)

    try:
        completion = client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": context_template + context},
                {"role": "user", "content": query}
            ],
            stream=True  # 启用流式响应
        )

        # 逐条打印流式输出的结果
        for chunk in completion:
            if chunk.choices[0].delta.content is not None:
                print(chunk.choices[0].delta.content, end="")

        print()  # 输出换行
        return "完成输出"

    except Exception as e:
        print(f"OpenAI API request failed: {e}")
        return "无法完成请求", []


if __name__ == '__main__':
    query = input("请输入查询: ")

    if query.strip() == "":
        query = "最新俄乌局势信息"

    print("正在搜索...")
    serper_context, other_queries = search_serper(query)
    bing_context = search_bing(query)

    context = []
    if bing_context:
        context.extend(bing_context)
    if serper_context:
        # 为Serper上下文的每个条目重置 position 值,以防止重复
        for index, item in enumerate(serper_context, start=len(bing_context)):
            item['position'] = index  # 从当前Bing结果的数量开始
        context.extend(serper_context)

    print("搜索结果:", context)
    search_openai(query, str(context))

    if other_queries:
        print("相关搜索:", other_queries)

4. 运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5G三大场景:eMBB、mMTC、uRLLC

1G,2G,3G,4G,5G有什么区别?5G的优势在哪?有什么应用? 1G,2G,3G,4G,5G有什么区别?5G的优势在哪?有什么应用?_3g4g5g的区别和作用-CSDN博客 从1G到4G,移动通信的核心是人与人之间的通信&#xff0…

Spring Cache框架(AOP思想)+ Redis实现数据缓存

文章目录 1 简介1.1 基本介绍1.2 为什么要用 Spring Cache? 2 使用方法2.1 依赖导入(Maven)2.2 常用注解2.3 使用步骤2.4 常用注解说明1)EnableCaching2)CachePut3)Cacheable4)CacheEvict 3 注意…

【云服务器】vscode + onethingAi + SSH远程连接

通过VS code远程连接服务器,并进行上传和下载文件操作_vs code 上传制定文件-CSDN博客 vscode远程连接服务器(remote ssh)上传本地文件到服务器(sftp)_vscode上传文件到服务器-CSDN博客 vscode连接远程服务器(傻瓜式教学&#x…

批发行业手机开单-手机开单 电子单 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、手机开单的好处 批发行业的业务拓展总是在路上,而手机开单的出现成为了业务人员的得力助手。无论身处何地,都能轻松操作,迅速完成开单流程,大幅提高工作效率。而且,通过手机还能明确开单人身份,自动完…

KaiwuDB 产品总监李月飞:让中国物联网用上放心的数据库产品

​2024年7月17日,KaiwuDB 产品总监李月飞受邀于 2024 可信数据库发展大会“能源与政务数据库应用创新”分论坛发表演讲。以下是李月飞主题演讲《深耕数据良田,KaiwuDB 洞见能源产业数字新生力》精华实录。 数据,给能源变革带来新的可能 众所…

基于SpringCloud alibaba的流媒体视频点播平台

基于SpringCloud alibaba的流媒体视频点播平台 前言整体架构具体实现视频播放 总结 先把项目地址放这 》基于SpringCloud alibaba的流媒体视频点播平台《 然后咱们来看看这个项目是干啥的。 前言 今天和大家分享一个项目,基于SpringCloud alibaba的流媒体视频点…

46 集合对象的创建与删除

集合(set)属于 Python 无序可变序列,使用一对大括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。 集合中只能包含数字、字符串、元组等不可变类型(…

吴恩达老师机器学习作业-ex7

导入库,读取数据,查看数据类型等进行分析,可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…

安防监控平台智能边缘分析一体机视频智能分析客流统计检测算法详细介绍

在当今数字化时代,数据的重要性不言而喻。特别是在零售、交通、安防等行业中,准确的客流统计数据对于业务决策、资源优化和安全管理至关重要。随着技术的进步,智能边缘分析一体机的出现为客流统计提供了一种高效、实时的解决方案。本文将详细…

【教育宝-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置: 点击环境变量 2.在系统变量 新增 JAVA_HOME;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

校园水电费管理小程序的设计

管理员账户功能包括:系统首页,个人中心,学生管理,教师管理,宿舍信息管理,学生缴费管理,教师缴费管理,系统管理 微信端账号功能包括:系统首页,我的 开发系统…

MSA+抑郁症模型总结(三)(论文复现)

MSA抑郁症模型总结(三)(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 MSA抑郁症模型总结(三)(论文复现)热门研究领域:情感计算的横向发展一、概述二、论…

了解关于标准化的知识

1.标准化组织 1.1国家标准化管理委员会(Standardization Administration of the Peoples Republic of China,简称SAC) TC--(Technical Committee) 技术委员会. SAC/TC,就是“国家标准化管理委员会”下属的一个专项或一个行业的“技术委员会或技术小组”&a…

MySQL--查询数据

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。其基本格式为&#xff1a; select {* | <字段列表>}[from <表1>,&l…

食堂窗口自助点餐小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;店铺信息管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…

Oracle SQL Developer 连接第三方数据库

首先Oracle SQL Developer除了支持连接Oracle数据库外&#xff0c;还支持连接第三方数据库&#xff0c;包括&#xff1a; Amazon RedshiftHiveIBM DB2MySQLMicrosoft SQL ServerSybase Adaptive ServerPostgreSQLTeradataTimesTen 首先&#xff0c;你需要在菜单Tools > Pr…

pypinyin,一个有趣的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - pypinyin。 Github地址&#xff1a;https://github.com/mozillazg/python-pinyin 在处理中文文本时&#xff0c;拼音转换是一项常见的需求。拼音在自然…

图片打印---print-js,解决图片过长过宽,溢出分页问题

提示&#xff1a;打印图片 文章目录 [TOC](文章目录) 前言一、调取window.print二、print-js通过图片url打印三、print-js把图片转成html后调整尺寸再打印总结 前言 一、调取window.print printImage.vue <template><div class"print_img_fixed"> <…

读零信任网络:在不可信网络中构建安全系统07设备信任

1. 设备信任 1.1. 在零信任网络中建立设备信任至关重要&#xff0c;这也是非常困难的一个环节 1.2. 建立设备信任是基石&#xff0c;直接影响零信任网络架构的成败 1.3. 大多数网络安全事件都和攻击者获得信任设备的控制权相关&#xff0c;这种情况一旦发生&#xff0c;信任…