怎样使用函数与知识库
这是个笔记的创建是基于参数生成笔记的基础上,创建一个可以访问知识库的代理和两个可以根据用户需求调用的函数。 我们要创建一个使用arXiv的数据的代理来回答关于学术主题的问题。有两个处理函数: - get_articles: 一个返回arXiv上的主题文章的函数,并使用链接列出摘要 - read_article_and_summarize: 采用之前搜索的文章,读取整篇文章,并总结核心论点、证据和结论
这将使您适应多功能工作流程,可以从多种服务中进行选择,其中第一个函数中的一些数据被持久化以供第二个函数使用。
演练
这个笔记会带你完成以下工作流程:
- 实用搜索:创建两个能从arXiv获得答案的函数
- 配置代理:构建代理行为,评估对某个函数的需求,如果需要,调用该函数并将结果返回给代理
- arXiv会话:在实时会话时把所有信息放在一起
# 导入 包
!pip install scipy
!pip install tenacity
!pip install tiktoken==0.3.3
!pip install termcolor
!pip install openai
!pip install arxiv
!pip install pandas
!pip install PyPDF2
!pip install tqdm
import os
import arxiv
import ast
import concurrent
import json
import os
import pandas as pd
import tiktoken
from csv import writer
from IPython.display import display, Markdown, Latex
from openai import OpenAI
from PyPDF2 import PdfReader
from scipy import spatial
from tenacity import retry, wait_random_exponential, stop_after_attempt
from tqdm import tqdm
from termcolor import colored
GPT_MODEL = "gpt-3.5-turbo-0613"
EMBEDDING_MODEL = "text-embedding-ada-002"
client = OpenAI()
1. 实用搜索
我们将首先设置一些实用程序来支持我们的两个函数。
下载的论文将存储在一个目录中(这里我们使用./data/papers)。我们创建了一个文件arxiv_library.csv来存储下载论文的嵌入和详细信息,以便使用summarize_text检索。
directory = './data/papers'
# 检查目录是否存在
if not os.path.exists(directory):
# 如果目录不存在,则创建并同时创建中间的所有目录
os.makedirs(directory)
print(f"目录 '{
directory}' 创建成功.")
else:
# 如果已经存在,则打印提示
print(f"目录 '{
directory}' 已经存在.")
# 设置一个目录来储存下载的论文
data_dir = os.path.join(os.curdir, "data", "papers")
paper_dir_filepath = "./data/arxiv_library.csv"
# 创建一个dataframe 用来存储下载文件
df = pd.DataFrame(list())
df.to_csv(paper_dir_filepath)
@retry(wait=wait_random_exponential(min=1, max=40), stop=stop_after_attempt(3))
def embedding_request(text):
# 创建embedding
response = client.embeddings.create(input=text, model=EMBEDDING_MODEL)
return response
@retry(wait=wait_random_exponential(min=1, max=40), stop=stop_after_attempt(3))
def get_articles(query, library=paper_dir_filepath, top_k=5):
"""
根据用户的查询返回前k个文章,存储相关信息。
下载文件并存储到arxiv_library.csv文件,并通过read_article_and_summarize进行检索
"""
client = arxiv.Client()
search = arxiv.Search(
query = "quantum",
max_results = 10,
sort_by = arxiv.SortCriterion.SubmittedDate
)
result_list = []
for result in client.results(search):
result_dict = {
}
result_dict.update({
"title": result.title})
result_dict.update({
"summary": result.summary})
# 获得第一个URL
result_dict.update({
"article_url": [x.href for x in result.links][0]})
result_dict.update({
"pdf_url": [x.href for x in result.links][1]})
result_list.append(result_dict)
# 在库文件里存储参考信