首页 > Python资料 博客日记
使用 Python 制作一个属于自己的 AI 搜索引擎
2024-08-21 02:00:07Python资料围观78次
这篇文章介绍了使用 Python 制作一个属于自己的 AI 搜索引擎,分享给大家做个参考,收藏Python资料网收获更多编程知识
1. 使用到技术
- OpenAI KEY
- Serper KEY
- 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. 运行结果
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj