五、OpenAi之函数调用(Function Calling)(三)


怎样使用函数与知识库

这是个笔记的创建是基于参数生成笔记的基础上,创建一个可以访问知识库的代理和两个可以根据用户需求调用的函数。 我们要创建一个使用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)

        # 在库文件里存储参考信
在AI模型的应用中,RAG(Retrieval-Augmented Generation)和LangChain中的Function Calling机制是两种重要的技术手段,它们各自具有不同的功能和应用场景,同时也可以在某些情况下协同工作。 ### RAG中的函数调用机制 RAG是一种结合了检索(Retrieval)和生成(Generation)的技术,主要用于增强模型的外部知识获取能力。它通过从外部文档或数据库中检索相关信息来辅助模型生成更准确、更丰富的回答。在RAG框架中,函数调用通常用于检索过程,即通过调用特定的函数来获取相关的外部数据[^2]。 例如,在一个需要回答关于最新科技进展的问题时,可以使用RAG技术,通过调用一个检索最新科研论文的函数来获取必要的信息。这种方式使得模型能够利用最新的研究成果,而不仅仅是依赖于其训练时的数据集。 ### LangChain中的函数调用机制 LangChain是一个旨在简化多步骤AI应用开发的框架,它允许开发者将多个AI模型和服务组合在一起,形成一个处理流程。在LangChain中,Function Calling是一种关键机制,它允许模型根据用户的输入动态地选择和调用适当的外部API或服务[^1]。 这种机制的一个典型应用场景是天气查询。假设用户询问某个城市的当前天气情况,LangChain可以通过调用一个天气API来获取实时数据,并将这些数据整合到最终的回答中。这不仅提高了回答的准确性和实用性,还展示了模型与外部世界互动的能力[^1]。 ### RAG与LangChain中的函数调用对比 尽管RAG和LangChain都利用了函数调用机制,但它们的应用场景和目的有所不同。RAG主要关注于从大量外部文档或数据库中检索信息,以支持生成高质量的回答;而LangChain则侧重于构建复杂的AI应用,通过调用特定的API或服务来完成具体的任务[^2]。 然而,这两种技术并非互斥,而是可以在某些情况下互补使用。例如,一个智能助手可以先通过RAG技术获取广泛的背景信息,然后通过LangChain中的Function Calling机制调用具体的API来获取实时数据,从而提供更加全面和精准的服务[^2]。 ### 示例代码 下面是一个简单的Python代码示例,演示了如何在LangChain中实现Function Calling机制: ```python def get_weather(city): # 模拟获取天气信息的过程 return f"The current weather in {city} is sunny." # 假设这是用户的问题 user_question = "What is the weather like in Beijing?" # 解析用户问题,确定需要调用的函数 if "weather" in user_question: city = "Beijing" weather_info = get_weather(city) print(f"Answer: {weather_info}") ``` 这段代码首先定义了一个`get_weather`函数,用于模拟获取天气信息的过程。接着,程序检查用户的问题是否涉及天气查询,如果是,则调用相应的函数并输出结果。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值