分类: 站长笔记

虚拟人生记录,站长思维沉淀

  • 如何使用Weights & Biases Weave监控OpenAI API调用

    在数字化时代,人工智能和深度学习技术正迅速发展,而OpenAI一直是这一领域的领先者之一。但是,随着项目和团队的增长,对OpenAI API的使用情况的监控变得越来越重要。本教程将向您展示如何使用Weights & Biases Weave来监控OpenAI API调用,了解项目和团队如何使用语言模型(LLMs),并可视化这些数据以便更好地管理您的项目。

    开篇故事

    想象一下,您正在领导一个人工智能团队,团队成员在多个项目中使用OpenAI的语言模型。您关心的不仅是项目的进展,还包括如何优化API调用、控制成本、降低延迟和提高吞吐量。然而,要了解这些关键指标,需要大量的数据和分析工作。这时,Weights & Biases Weave登场了。它为您提供了一个强大的工具,可以自动跟踪LLM的使用情况,记录有关成本、延迟和吞吐量的关键指标,并为您提供交互式的仪表板,以便更轻松地与团队共享进展。

    步骤0:设置

    在开始之前,您需要进行一些设置。首先,安装所需的依赖项,然后登录到Weights & Biases(W&B)以保存和分享您的工作,并与OpenAI进行身份验证。

    # 如果尚未安装
    !pip install -qqq weave openai tiktoken wandb
    
    import wandb
    wandb.login()
    
    import weave
    import os
    WANDB_BASE_URL = "https://api.wandb.ai"
    os.environ["WANDB_BASE_URL"] = WANDB_BASE_URL
    
    # 与OpenAI进行身份验证
    from getpass import getpass
    
    if os.getenv("OPENAI_API_KEY") is None:
      os.environ["OPENAI_API_KEY"] = getpass("从 https://platform.openai.com/account/api-keys 复制粘贴您的OpenAI密钥\n")
    assert os.getenv("OPENAI_API_KEY", "").startswith("sk-"), "这似乎不是一个有效的OpenAI API密钥"
    print("OpenAI API密钥已配置")

    步骤1:配置数据流和存储在W&B中

    在W&B中,您需要配置数据流和存储,以便记录OpenAI API调用的日志。设置WB_ENTITY为您的W&B用户名或团队名称,WB_PROJECT为项目名称,STREAM_NAME为记录表的名称。

    WB_ENTITY = # 设置为您的W&B用户名或团队名称
    WB_PROJECT = "weave"  # 为此工作创建顶级目录
    STREAM_NAME = "openai_logs"  # 记录表,用于存储OpenAI API调用的日志

    步骤2:调用init_monitor()

    要开始监控OpenAI API的使用情况,请调用init_monitor(<stream>),其中<stream>的格式为<wandb_team_or_user>/<wandb_project>/<stream_name>。该流会记录并存储所有OpenAI API调用的日志。

    from weave.monitoring import openai, init_monitor
    m = init_monitor(f"{WB_ENTITY}/{WB_PROJECT}/{STREAM_NAME}")
    
    # 为简单起见,指定一个模型
    OPENAI_MODEL = 'gpt-3.5-turbo'
    
    # 使用一些示例日志进行预填充
    r = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[{"role": "user", "content": "hello world!"}])
    r = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[{"role": "user", "content": "what is 2+2?"}])

    步骤3:预览监控仪表板

    点击上面的链接预览数据流,然后在右侧边栏中点击“OpenAI Monitor Board”以为此数据流创建Weave Board。

    步骤4:探索和了解您的LLM使用情况

    要保存您的工作,请单击页面顶部的自动生成名称以重命名面板。要分享您的面板,请单击右上角的“发布”。

    通过以下方式,您可以实时可视化您的工作:

    • 将面板保持在单独的选项卡中,并刷新以查看最新数据。
    • 随时重命名面板以更容易参考,并“发布”该版本以与他人共享链接。
    • 通过从weave.wandb.ai导航到相关的W&B实体和W&B项目名称,找到以前保存的面板。
    • 或者打开一个新的面板模板的实例,以从迄今为止积累的所有数据开始。

    接下来,我们将举例说明一些您可以跟踪OpenAI API调用的方式。根据您的用例,还有许多其他可能性,我们迫不及待地期待您从这些起始模板中创建的内容。

    示例

    示例0:记录提示及其完成

    监视ChatCompletion请求并打印相应的响应,仅提取完成的文本。

    response = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[
            {"role": "user", "content": f"生命、宇宙和一切的意义是什么?"},
        ])
    print(response['choices'][0]['message']['content'])

    示例1:将相关参数作为属性进行跟踪

    将感兴趣的参数分解并将其作为日志记录的属性进行跟踪。在这里,我们将“系统提示”与“提示模板”和“方程”参数分开跟踪。这次我们将打印ChatCompletion调用的完整结构化响应。

    system_prompt = "你总是写成要点"
    prompt_template = '逐步解决以下方程:{equation}'
    params = {'equation': '4 * (3 - 1)'}
    openai.ChatCompletion.create(model=OPENAI_MODEL,
                                 messages=[
                                        {"role": "system", "content": system_prompt},
                                        {"role": "user", "content": prompt_template.format(**params)},
                                    ],
                                 # 您可以在日志记录中添加其他属性
                                 # 有关更多示例,请参见monitor_api笔记本
                                 monitor_attributes={
                                     'system_prompt': system_prompt,
                                     'prompt_template': prompt_template,
                                     'params': params
                                 })

    示例2:记录一系列消息的实时流

    监视消息流并将结果记录为单个记录。请注意:此格式不计算标记数。

    from weave.monitoring.openai import message_from_stream
    r = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[
            {"role": "system", "content": "你是一个机器人,只说像机器人一样的话,比如滴滴滴。"},
            {"role": "user", "content": "给我讲一个50字的故事。"},
        ], stream=True)
    for s in message_from_stream(r):
        print(s, end='')

    示例3:结构化提示工程实验

    在这里,我们比较了一些系统提示、用户问题和目标受众的玩具选项。尝试您自己的实验,看看在探索Board并按不同参数分组时是否会出现有趣的见解。

    def explain_math(system_prompt, prompt_template, params):
        openai.ChatCompletion.create(model=OPENAI_MODEL,
                                 messages=[
                                        {"role": "system", "content": system_prompt},
                                        {"role": "user", "content": prompt_template.format(**params)},
                                    ],
                                 # 您可以在日志记录中添加其他属性
                                 # 有关更多示例,请参见monitor_api笔记本
                                 monitor_attributes={
                                     'system_prompt': system_prompt,
                                     'prompt_template': prompt_template,
                                     'params': params
                                 })
    
    # 随时替换您自己的提示 :)
    system_prompts = ["你写得非常花哨和诗意", "你非常直接和准确", "平衡简洁和见解"]
    prompt_template = '解释以下方程的解给{audience}听:{equation}'
    equations = ['x^2 + 4x + 9 = 0', '15 * (2 - 6) / 4']
    audience = ["新生", "数学天才"]
    
    for system_prompt in system_prompts:
        for equation in equations:
            for person in audience:
                params = {"equation" : equation, "audience" : person}
                explain_math(system_prompt, prompt_template, params)

    总结

    通过Weights & Biases Weave,您可以轻松监控OpenAI API的使用情况,了解项目和团队如何使用LLMs,并可视化这些数据以便更好地管理您的项目。这种实时监控和数据分析工具将有助于您更好地掌握AI项目的进展,优化API调用,并降低成本。

    希望这个教程对您有所帮助,让您更好地利用Weights & Biases Weave来管理和优化您的OpenAI API项目。如果您有任何问题或需要进一步的帮助,请随时联系我们。

  • 深度学习与自然语言处理:LangChain、Deep Lake和OpenAI实现问答系统

    深度学习和自然语言处理领域一直是人工智能中备受关注的话题。如何构建一个强大的问答系统一直是研究人员和工程师们的追求。本教程将向您展示如何使用LangChain、Deep Lake和OpenAI实现一个强大的问答系统,让您的计算机能够回答各种问题。

    开篇故事

    在数字化时代,信息爆炸式增长,我们每天都会遇到各种各样的问题,从学术研究到日常生活。有时,我们需要快速准确地找到答案,而这正是问答系统的价值所在。想象一下,您正在研究一个复杂的问题,但是文献太多,难以阅读和理解。这时,一个高效的问答系统可以帮助您迅速找到相关信息,加速研究进程。或者,您可能只是想了解一些日常生活中的知识,比如为什么军事不说24:00。无论是学术研究还是日常生活,一个强大的问答系统都能提供帮助。

    步骤1:安装所需的软件包

    首先,让我们安装需要的软件包,以便开始构建我们的问答系统。在这个教程中,我们将使用LangChain、Deep Lake和OpenAI等工具。

    !pip install deeplake langchain openai tiktoken

    步骤2:身份验证

    接下来,我们需要提供您的OpenAI API密钥,以便进行身份验证。这个密钥将允许我们使用OpenAI的功能来增强我们的问答系统。

    import getpass
    import os
    
    os.environ['OPENAI_API_KEY'] = getpass.getpass()

    步骤3:加载Deep Lake文本数据集

    我们将使用Deep Lake中的文本数据集作为我们的知识库,以便问答系统可以从中提取信息。在这个示例中,我们使用了一个包含20000个样本的子集,这个数据集是来自cohere-wikipedia-22的。

    import deeplake
    
    ds = deeplake.load("hub://activeloop/cohere-wikipedia-22-sample")
    ds.summary()

    步骤4:LangChain的Deep Lake向量存储

    现在,让我们为LangChain的Deep Lake向量存储定义一个路径。这个向量存储将包含我们的文本嵌入。

    dataset_path = 'wikipedia-embeddings-deeplake'

    接下来,我们将设置OpenAI的文本嵌入模型,并初始化一个Deep Lake向量存储。

    from langchain.embeddings.openai import OpenAIEmbeddings
    from langchain.vectorstores import DeepLake
    
    embedding = OpenAIEmbeddings(model="text-embedding-ada-002")
    db = DeepLake(dataset_path, embedding=embedding, overwrite=True)

    现在,让我们将样本数据逐批添加到向量存储中。

    from tqdm.auto import tqdm
    
    batch_size = 100
    nsamples = 10  # 用于测试。将其替换为len(ds)以添加所有数据
    
    for i in tqdm(range(0, nsamples, batch_size)):
        i_end = min(nsamples, i + batch_size)
        batch = ds[i:i_end]
        id_batch = batch.ids.data()["value"]
        text_batch = batch.text.data()["value"]
        meta_batch = batch.metadata.data()["value"]
        db.add_texts(text_batch, metadatas=meta_batch, ids=id_batch)

    步骤5:在数据库上运行用户查询

    现在,我们的问答系统已经构建好了,我们可以在数据库上运行用户的查询。我们使用了GPT-3.5-Turbo作为我们的语言模型,它可以根据用户的查询来查找最相关的信息。

    from langchain.chains import RetrievalQA
    from langchain.chat_models import ChatOpenAI
    
    qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(model='gpt-3.5-turbo'), chain_type="stuff", retriever=db.as_retriever())
    
    query = '为什么军事不说24:00?'
    answer = qa.run(query)

    通过这个问答系统,您可以轻松地获取关于各种话题的答案,无论是学术研究还是日常生活中的疑问。问答系统的强大之处在于它可以从大量的文本数据中提取准确的信息,为您提供及时的帮助。

    总结

    在这个教程中,我们学习了如何使用LangChain、Deep Lake和OpenAI构建一个强大的问答系统。通过加载文本数据集、初始化向量存储和使用语言模型,我们可以实现一个高效的问答系统,可以回答各种各样的问题。无论您是在进行学术研究还是在解决日常问题,这个问答系统都可以为您提供有力的支持。

  • 如何使用搜索API和重新排序来进行问题回答

    有时候,寻找相关信息就像大海捞针一样困难,但不要绝望,GPT可以为我们做很多工作。在本指南中,我们将探讨一种使用各种人工智能技术增强现有搜索系统的方法,帮助我们筛选信息中的噪音。

    GPT检索信息的两种方式如下:

    1. 模仿人类浏览:GPT触发搜索,评估结果,如果必要的话,修改搜索查询。它还可以跟踪特定的搜索结果,形成思维链,就像人类用户会做的那样。
    2. 使用嵌入进行检索:为你的内容和用户查询计算嵌入,然后根据余弦相似度测量选择与用户查询最相关的内容。这种技术在像Google这样的搜索引擎中被广泛使用。

    这两种方法都有潜力,但各自都有缺点:第一种方法由于其迭代性质可能较慢,第二种方法需要预先嵌入整个知识库,不断嵌入新内容并维护矢量数据库。

    通过结合这些方法,并从重新排序方法中汲取灵感,我们找到了一种介于两者之间的方法。这种方法可以在任何现有搜索系统的基础上实施,如Slack搜索API或带有私有数据的内部ElasticSearch实例。它的工作原理如下:

    步骤1:搜索

    1. 用户提出问题。
    2. GPT生成一组潜在的查询。
    3. 并行执行搜索查询。

    步骤2:重新排序

    1. 使用每个结果的嵌入来计算与生成的假设理想答案对用户问题的语义相似性。
    2. 根据此相似性度量对结果进行排序和过滤。

    步骤3:回答

    1. 针对前几名搜索结果,模型生成回答用户问题的答案,包括引用和链接。

    这种混合方法提供了相对较低的延迟,并且可以集成到任何现有的搜索端点中,而无需维护矢量数据库。下面让我们深入了解吧!我们将以News API作为示例领域进行搜索。

    设置

    除了你的OPENAI_API_KEY,你还需要在环境中包含一个NEWS_API_KEY。你可以在这里获取API密钥。

    %env NEWS_API_KEY = YOUR_NEWS_API_KEY
    
    # 依赖项
    from datetime import date, timedelta  # 用于获取最近新闻的日期处理
    from IPython import display  # 用于漂亮的打印
    import json  # 用于解析JSON API响应和模型输出
    from numpy import dot  # 用于余弦相似度
    import openai  # 用于使用GPT和获取嵌入
    import os  # 用于加载环境变量
    import requests  # 用于进行API请求
    from tqdm.notebook import tqdm  # 用于显示进度条

    以上是初始化所需的依赖项和环境变量设置。接下来,我们将逐步执行三个主要步骤:搜索、重新排序和回答。

    步骤1:搜索

    一切都始于用户的问题。首先,用户提出一个问题,然后我们使用GPT生成一系列多样化的查询,以尽可能详尽的方式回答问题。

    # 用户提出问题
    USER_QUESTION = "谁赢得了NBA总冠军?最有价值球员是谁?告诉我一些关于最后一场比赛的情况。"
    
    # 为了尽可能详尽,我们使用模型生成基于此问题的各种查询。
    QUERIES_INPUT = f"""
    你有访问一个返回最近新闻文章的搜索API。
    生成一个与这个问题相关的搜索查询数组。
    为查询使用相关关键字的变体,尽量做到通用。
    包括尽可能多的查询,包括和不包括术语。
    例如,包括像['关键词1 关键词2','关键词1','关键词2']这样的查询。
    要有创造性。包括的查询越多,找到相关结果的可能性就越大。
    
    用户问题: {USER_QUESTION}
    
    格式: {{"queries": ["query_1", "query_2", "query_3"]}}
    """
    
    queries = json_gpt(QUERIES_INPUT)["queries"]
    
    # 让我们也包括原始问题以确保全面。
    queries.append(USER_QUESTION)
    
    queries

    以上代码生成了一系列搜索查询,这些查询包括与用户问题相关的多个关键字和变体。这些查询将在接下来的搜索步骤中用于检索新闻文章。

    接下来,让我们运行这些搜索查询以获取新闻文章。

    def search_news(
        query: str,
        news_api_key: str = news_api_key,
        num_articles: int = 50,
        from_datetime: str = "2023-06-01",  # 2023年NBA总决赛于2023年6月举行
        to_datetime: str = "2023-06-30",
    ) -> dict:
        response = requests.get(
            "https://newsapi.org/v2/everything",
            params={
                "q": query,
                "apiKey": news_api_key,
                "pageSize": num_articles,
                "sortBy": "relevancy",
                "from": from_datetime,
                "to": to_datetime,
            },
        )
    
        return response.json()
    
    articles = []
    
    for query in tqdm(queries):
        result = search_news(query)
        if result["status"] == "ok":
            articles = articles + result["articles"]
    
        else:
            raise Exception(result["message"])
    
    # 移除重复文章
    articles = list({article["url"]: article for article in articles}.values())
    
    print("文章总数:", len(articles))
    print("查询1的前5篇文章:", "\n")
    
    for article in articles[0:5]:
        print("标题:", article["title"])
        print("描述:", article["description"])
        print("内容:", article["content"][0:100] + "...")
        print()

    以上代码执行了搜索查询并获取了与这些查询相关的新闻文章。注意,为了减少重复,我们在获取文章后删除了重复的文章。

    现在,我们已经获得了新闻文章,但很多时候搜索查询会返回大量结果,其中许多与用户最初提出的问题无关。为了提高最终答案的质量,我们将使用嵌入来重新排序和过滤结果。

    步骤2:重新排序

    受HyDE(Gao等人)启发,我们首先生成一个假设理想答案,用于对比和重新排列我们的结果。这有助于优先考虑看起来是好答案的结果,而不是与我们的问题类似的结果。下面是我们用来生成假设答案的提示。

    HA_INPUT = f"""
    生成一个假设的答案,以回答用户的问题。这个答案将用于排名搜索结果。
    假装你拥有回答所需的所有信息,但不要使用任何实际的事实。而是使用占位符
    比如,NAME在某地做了某事,或者NAME在某地说了某话。
    
    用户问题: {USER_QUESTION}
    
    格式: {{"hypotheticalAnswer": "假设答案文本"}}
    """
    
    hypothetical_answer = json_gpt(HA_INPUT)["hypotheticalAnswer"]
    
    hypothetical_answer

    以上代码生成了一个假设答案,这个答案包含了关于NBA总决赛的信息,但没有使用实际的事实,而是使用了占位符。接下来,我们将为搜索结果和假设答案生成嵌入,然后计算这些嵌入之间的余弦距离,得到语义相似性度量。请注意,由于OpenAI嵌入在API中返回时已经归一化,我们可以简单地计算点积来代替进行完整的余弦相似性计算。

    hypothetical_answer_embedding = embeddings(hypothetical_answer)[0]
    article_embeddings = embeddings(
        [
            f"{article['title']} {article['description']} {article['content'][0:100]}"
            for article in articles
        ]
    )
    
    # 计算余弦相似度
    cosine_similarities = []
    for article_embedding in article_embeddings:
        cosine_similarities.append(dot(hypothetical_answer_embedding, article_embedding))
    
    cosine_similarities[0:10]

    以上代码计算了假设答案与每篇文章的嵌入之间的余弦相似性。这些相似性分数将用于对结果进行排序和过滤。

    最后,我们使用这些相似性分数对结果进行排序和过滤。

    scored_articles = zip(articles, cosine_similarities)
    
    # 根据余弦相似度对文章进行排序
    sorted_articles = sorted(scored_articles, key=lambda x: x[1], reverse=True)
    
    # 打印前5篇文章
    print("前5篇文章:", "\n")
    
    for article, score in sorted_articles[0:5]:
        print("标题:", article["title"])
        print("描述:", article["description"])
        print("内容:", article["content"][0:100] + "...")
        print("分数:", score)
        print()

    以上代码对文章进行了排序,按照与假设答案的语义相似性得分降序排列。这些排序后的文章看起来与我们最初的查询更相关。现在,让我们使用前5个结果生成最终答案。

    步骤3:回答

    formatted_top_results = [
        {
            "title": article["title"],
            "description": article["description"],
            "url": article["url"],
        }
        for article, _score in sorted_articles[0:5]
    ]
    
    ANSWER_INPUT = f"""
    根据给定的搜索结果为用户的问题生成答案。 
    顶部结果: {formatted_top_results}
    用户问题: {USER_QUESTION}
    
    在答案中包括尽可能多的信息。引用相关的搜索结果URL作为Markdown链接。
    """
    
    completion = openai.ChatCompletion.create(
        model=GPT_MODEL,
        messages=[{"role": "user", "content": ANSWER_INPUT}],
        temperature=0.5,
        stream=True,
    )
    
    text = ""
    for chunk in completion:
        text += chunk.choices[0].delta.get("content", "")
        display.clear_output(wait=True)
        display.display(display.Markdown(text))

    以上代码使用前5个搜索结果生成了最终的答案,其中包括引用了相关搜索结果的链接。

    至此,我们已经完成了搜索、重新排序和回答的所有步骤。下面,让我们根据以上内容编写一篇优秀的教程文章,满足指定的要求。

    如何使用搜索API和重新排序进行问题回答

    开篇故事

    搜索相关信息有时候就像在庞大的信息海洋中寻找一根针一样困难。但不要担心,人工智能技术可以帮助我们在这个任务中取得很大进展。在本文中,我们将探讨一种方法,利用搜索API和嵌入技术,以及重新排序方法,来实现更准确的问题回答。

    故事开始于一个充满好奇心的用户,他有一个问题:谁赢得了NBA总冠军?最有价值球员是谁?告诉我一些关于最后一场比赛的情况。这个问题看似简单,但

    要从海量的新闻文章中找到相关的信息可能会让人望而却步。

    步骤1:搜索

    首先,用户提出了一个问题。这个问题是我们开始寻找答案的出发点。但为了尽可能全面地查找相关信息,我们使用人工智能模型生成了多个不同的查询,这些查询都与用户的问题相关。这些查询包括谁赢得了NBA总冠军、NBA总决赛的MVP是谁,以及最后一场比赛的概述等等。这些查询一起被发送到搜索API中,以并行方式执行搜索。

    步骤2:重新排序

    一旦我们获得了搜索结果,接下来的步骤是对这些结果进行重新排序。这一步骤受到了HyDE(Gao等人)的启发。我们首先生成了一个假设的理想答案,该答案包含了关于NBA总决赛的信息,但没有使用任何实际的事实,而是使用了占位符。然后,我们为搜索结果和假设答案生成了嵌入,这些嵌入可以帮助我们度量它们之间的语义相似性。最终,我们使用语义相似性分数对结果进行排序,以找出最相关的答案。

    步骤3:回答

    最后,我们使用排名最高的搜索结果生成最终的答案。这个答案包括了与NBA总决赛有关的信息,并引用了相关搜索结果的链接,以便用户可以深入了解。

    通过这个混合方法,我们能够在相对低的延迟下获得高质量的答案,而无需维护一个向量数据库。这种方法可以集成到任何现有的搜索系统中,无论是Slack搜索API还是具有私有数据的内部ElasticSearch实例。

    希望本文对你理解如何使用搜索API和重新排序来回答问题有所帮助!

  • 如何充分利用大型语言模型

    在数字时代,人工智能的崛起给我们带来了前所未有的可能性。而在这个无处不在的AI时代,大型语言模型如GPT-3则成为了实现许多创意和任务的得力助手。无论是在编程、创作、还是解答问题上,大型语言模型都能发挥巨大的作用。本文将深入探讨大型语言模型的工作原理以及如何充分掌握它们,以提高工作效率和创造力。

    什么是大型语言模型?

    大型语言模型是将文本映射到文本的函数。给定一个文本输入,大型语言模型会预测接下来应该出现的文本。这些模型之所以如此神奇,是因为它们通过在大量文本上训练来最小化预测误差,从而学到了对这些预测有用的概念。这包括拼写、语法、改写、回答问题、进行对话、以及多种语言和编程等等能力。所有这些能力都不是显式编程的结果,而是通过训练而来。

    如何控制大型语言模型?

    在大型语言模型的所有输入中,最具影响力的是文本提示。

    大型语言模型可以通过以下几种方式来引导生成输出:

    1. 指令提示:告诉模型你想要什么
    2. 完成提示:诱使模型完成你想要的开头
    3. 演示提示:向模型展示你想要的内容,可以使用以下方式之一:
      • 在提示中提供一些示例
      • 在微调训练数据集中提供数百或数千个示例
    4. 细调提示:通过足够多的训练示例,你可以对自定义模型进行细调。在这种情况下,指令是不必要的,因为模型可以从提供的训练数据中学到任务。然而,为了告诉模型何时结束提示并开始输出,包括分隔符序列是有帮助的。

    下面分别介绍这些方式的示例。

    指令提示

    指令遵循模型(例如,text-davinci-003或任何以text-开头的模型)是专门设计用于遵循指令的。在提示的顶部(或底部,或两者),写下你的指令,模型会尽力遵循指令然后停止。指令可以详细,所以不要害怕写一段详细说明你想要的输出。

    示例指令提示:

    提取以下引语中的作者名字。

    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》
    输出:

    特德·奇昂

    完成提示示例

    完成提示利用了大型语言模型试图编写它认为最有可能出现的文本的方式。为了引导模型,可以尝试开始一个模式或句子,然后由你想要看到的输出来完成。相对于直接的指令,这种方式需要更多的注意和实验。此外,模型不一定知道何时停止,因此通常需要停止序列或后处理来截断生成的文本,以保持所需的输出。

    示例完成提示:

    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》

    这段引文的作者是谁?
    输出:

    特德·奇昂

    演示提示示例(少样本学习)

    与完成提示类似,演示可以向模型展示你想要它做什么。这种方法有时被称为少样本学习,因为模型从提示中提供的一些示例中学习。

    示例演示提示:

    引文:
    “当理性的思维被迫一次又一次地面对不可能时,它别无选择,只能适应。”
    ― N.K.杰米辛,《第五季》
    作者:N.K.杰米辛

    引文:
    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》
    作者:
    输出:

    特德·奇昂

    细调提示示例

    通过足够多的训练示例,你可以对自定义模型进行细调。在这种情况下,指令是不必要的,因为模型可以从提供的训练数据中学到任务。然而,可以包括分隔序列(例如,->或###或任何不常出现在输入中的字符串)来告诉模型提示何时结束并开始输出。如果没有分隔序列,模型可能会继续详细说明输入文本,而不是开始你想要看到的

    答案。

    示例细调提示(针对已经根据类似提示-完成对进行了自定义训练的模型):

    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》

    代码能力

    大型语言模型不仅擅长处理文本,还可以处理代码。OpenAI的专用代码模型被称为Codex。

    Codex驱动着超过70种产品,包括:

    • GitHub Copilot(在VS Code和其他IDE中自动完成代码)
    • Pygma(将Figma设计转化为代码)
    • Replit(具有“解释代码”按钮和其他功能)
    • Warp(带有AI命令搜索的智能终端)
    • Machinet(编写Java单元测试模板)

    需要注意的是,与遵循指令的文本模型(例如text-davinci-002)不同,Codex没有经过训练以遵循指令。因此,设计良好的提示可能需要更多的细心。

    更多提示建议

    对于更多的提示示例,请访问OpenAI Examples。

    总之,输入提示是改进模型输出的最佳方法。你可以尝试以下技巧:

    • 提供更明确的指令。例如,如果你希望输出是一个逗号分隔的列表,请要求它返回一个逗号分隔的列表。如果你希望模型在不知道答案时说“我不知道”,请告诉它在不知道答案时说“我不知道”。
    • 提供更好的示例。如果你在提示中演示示例,请确保你的示例多样化且质量高。
    • 要求模型以专家的方式回答。明确要求模型产生高质量的输出,或者要求它以专家的方式撰写输出,可以促使模型提供更高质量的答案,因为它会认为专家会这样写。例如,“以下答案是正确的、高质量的,是由专家撰写的。”
    • 引导模型写下解释其推理过程的一系列步骤。例如,在最终答案之前加上类似“让我们逐步思考”的内容。提示模型在最终答案之前解释其推理过程可以增加最终答案一致性和正确性的可能性。

    结语

    大型语言模型如GPT-3是现代工作和创作的有力工具。通过充分了解它们的工作原理以及如何引导它们,你可以提高工作效率和创造力,从而更好地实现自己的目标。

  • 如何使用ChatGPT模型格式化输入

    在这个信息爆炸的时代,获取准确的信息和知识变得愈发重要。想象一下,你正在进行一项复杂的编程任务,但你不确定如何开始。这时,有一个智能助手可以为你提供指导和建议,无疑会让你事半功倍。ChatGPT就是这样一个强大的工具,它可以理解你的问题,并提供有价值的回答。本文将介绍如何格式化输入,以充分利用ChatGPT模型的能力。

    格式化输入

    ChatGPT模型的核心功能是接受一系列消息作为输入,并生成一条由AI编写的消息作为输出。要正确使用ChatGPT,你需要了解如何格式化输入消息。每个消息对象包括以下字段:

    • role:消息的角色,可以是系统、用户或助手。
    • content:消息的内容,包括问题、指令等。
    • name:可选字段,为消息的发送者命名。

    通常,一次对话会以系统消息开始,告诉助手如何行动,然后是交替的用户和助手消息。不过,并不一定要遵循这种格式。

    以下是一个示例Chat API调用,展示了消息的格式:

    MODEL = "gpt-3.5-turbo"
    response = openai.ChatCompletion.create(
        model=MODEL,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Knock knock."},
            {"role": "assistant", "content": "Who's there?"},
            {"role": "user", "content": "Orange."},
        ],
        temperature=0,
    )
    
    response

    这个示例中,我们首先定义了模型(可以选择不同的模型),然后创建了一个包含系统、用户和助手消息的消息列表。通过这种方式,你可以与ChatGPT建立对话并获取回复。

    系统消息

    系统消息可以用来设定助手的行为和性格。要注意,不同版本的ChatGPT模型对系统消息的关注程度可能会有所不同。有时,将重要的指令放在用户消息中会更有效。

    以下是一个系统消息的示例,用来设定助手的性格:

    response = openai.ChatCompletion.create(
        model=MODEL,
        messages=[
            {"role": "system", "content": "You are a friendly and helpful teaching assistant. You explain concepts in great depth using simple terms, and you give examples to help people learn. At the end of each explanation, you ask a question to check for understanding"},
            {"role": "user", "content": "Can you explain how fractions work?"},
        ],
        temperature=0,
    )

    这个系统消息告诉助手在解释概念时要深入浅出,并在每个解释结束时提出问题以检查理解。

    举例说明

    有时,向模型展示你想要的内容比告诉模型更容易。你可以使用模拟的示例消息来说明你的需求,这是一种有效的方法。

    以下是一个示例,展示了如何使用示例消息来教助手将商业术语翻译成简单的语言:

    response = openai.ChatCompletion.create(
        model=MODEL,
        messages=[
            {"role": "system", "content": "You are a helpful, pattern-following assistant."},
            {"role": "user", "content": "Help me translate the following corporate jargon into plain English."},
            {"role": "assistant", "content": "Sure, I'd be happy to!"},
            {"role": "user", "content": "New synergies will help drive top-line growth."},
            {"role": "assistant", "content": "Things working well together will increase revenue."},
            {"role": "user", "content": "Let's circle back when we have more bandwidth to touch base on opportunities for increased leverage."},
            {"role": "assistant", "content": "Let's talk later when we're less busy about how to do better."},
            {"role": "user", "content": "This late pivot means we don't have time to boil the ocean for the client deliverable."},
        ],
        temperature=0,
    )

    在这个示例中,助手被引导使用简单的语言来解释商业术语。

    计算标记数量

    在使用ChatGPT模型时,消息中包含的标记数量会影响请求的成本、生成响应的时间以及响应是否会因达到最大标记限制而被截断。

    你可以使用以下函数来计算消息中包含的标记数量:

    import tiktoken
    
    def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613"):
        # 计算标记数量的函数
        # ...

    这个函数会帮助你了解消息中的标记数量,以便更好地管理成本和响应时间。

    结束语

    ChatGPT模型是一个强大的工具,可以为你提供有用的回答和建议。通过了解如何格式化输入消息,你可以更有效地与模型互动,获得所需的帮助。不断尝试不同的指令和示例消息,以使模型更好地满足你的需求。

    现在,你已经了解了如何使用ChatGPT模型,开始享受其带来的便利吧!

  • 如何使用tiktoken计算文本中的标记数

    在现代自然语言处理中,标记是一种重要的概念,因为它们是语言模型处理文本的基本单元。本教程将向您展示如何使用OpenAI开源的快速分词工具tiktoken来计算文本中的标记数。通过了解文本中有多少标记,您可以:

    1. 判断文本是否太长以至于超出模型处理的限制。
    2. 了解使用OpenAI API调用的成本,因为计费是按标记计算的。

    1. 引言故事

    假设您是一名程序员,正在为自己的聊天应用项目编写代码。您已经集成了一个强大的自然语言处理模型,但现在需要确定用户输入的文本有多少标记,以便确保不会超出模型的限制。在解决这个问题之前,您曾不止一次被意想不到的文本长度问题困扰。一天,您在互联网上发现了一个名为tiktoken的开源工具,它能够快速准确地计算文本中的标记数。这似乎是您解决问题的完美工具,因此您决定深入了解它并开始使用它来解决您的标记计数问题。

    2. 安装tiktoken

    首先,您需要安装tiktoken工具。您可以使用pip来安装它:

    pip install --upgrade tiktoken

    安装完成后,您就可以开始使用tiktoken来计算文本中的标记数了。

    3. 导入tiktoken

    在您的Python项目中,首先导入tiktoken库:

    import tiktoken

    4. 加载编码

    接下来,您需要加载一个编码,以告诉tiktoken如何将文本转换为标记。不同的模型使用不同的编码。在本示例中,我们使用了“cl100k_base”编码,它适用于一些OpenAI模型,包括gpt-4和gpt-3.5-turbo。您可以这样加载编码:

    encoding = tiktoken.get_encoding("cl100k_base")

    5. 使用编码.encode()方法将文本转换为标记

    现在,您可以使用编码对象的.encode()方法将文本转换为标记。该方法将文本字符串转换为标记的整数列表。例如,如果我们有文本字符串"tiktoken is great!",您可以这样做:

    tokens = encoding.encode("tiktoken is great!")

    这将返回一个整数列表,代表文本中的标记。在这个示例中,返回的标记列表为[83, 1609, 5963, 374, 2294, 0]

    要计算文本中的标记数,只需查看标记列表的长度:

    num_tokens = len(tokens)

    这将给您文本中的标记数,本例中为6个标记。

    6. 使用编码.decode()方法将标记转换回文本

    如果您需要将标记转换回文本,可以使用编码对象的.decode()方法。例如,如果我们有标记列表[83, 1609, 5963, 374, 2294, 0],您可以这样做:

    text = encoding.decode([83, 1609, 5963, 374, 2294, 0])

    这将返回文本字符串"tiktoken is great!"。

    请注意,虽然.decode()方法可以应用于单个标记,但对于不在utf-8边界上的标记,它可能会导致信息丢失。对于单个标记,.decode_single_token_bytes()方法可以安全地将单个整数标记转换为其表示的字节。

    7. 比较不同编码

    不同编码在分割单词、分组空格和处理非英文字符方面有所不同。使用上述方法,我们可以比较不同编码在几个示例字符串上的效果。以下是一个比较不同编码的函数示例:

    def compare_encodings(example_string: str) -> None:
        """打印三种字符串编码的比较结果。"""
        # 打印示例字符串
        print(f'\n示例字符串: "{example_string}"')
        # 对于每个编码,打印标记数、标记整数和标记字节
        for encoding_name in ["r50k_base", "p50k_base", "cl100k_base"]:
            encoding = tiktoken.get_encoding(encoding_name)
            token_integers = encoding.encode(example_string)
            num_tokens = len(token_integers)
            token_bytes = [encoding.decode_single_token_bytes(token) for token in token_integers]
            print()
            print(f"{encoding_name}: {num_tokens} 个标记")
            print(f"标记整数: {token_integers}")
            print(f"标记字节: {token_bytes}")
    
    compare_encodings("antidisestablishmentarianism")

    8. 为聊天完成API调用计算标记数

    对于像gpt-3.5-turbo和gpt-4这样的ChatGPT模型,它们使用标记方式与较早的完成模型相同,但由于它们基于消息格式,因此更难计算消息将使用多少标记。

    以下是一个用于计算传递给gpt-3.5-turbo或gpt-4的消息标记数的示例函数。请注意,从消息中计算标记的方式可能会因模型而异。考虑到下面的函数中计算的标记数量是一个估计值,而不是一个永恒的保证。

    def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613"):
        """返回消息列表使用的标记数。"""
        try:
            encoding
    
     = tiktoken.get_encoding(model)
        except Exception as e:
            print(f"获取编码时发生错误:{e}")
            return None
    
        total_tokens = 0
        for message in messages:
            tokens = encoding.encode(message["content"])
            num_tokens = len(tokens)
            # 添加额外的标记以表示用户或系统角色
            if message["role"] == "system":
                num_tokens += 1
            else:
                num_tokens += 2  # 一个用于角色,一个用于分隔符
            total_tokens += num_tokens
    
        return total_tokens
    
    # 示例消息列表
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Tell me a joke."},
        {"role": "assistant", "content": "Why did the chicken cross the road?"},
        {"role": "user", "content": "I don't know, why did the chicken cross the road?"}
    ]
    
    total_tokens = num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613")
    print(f"消息列表中的总标记数:{total_tokens}")

    这个函数可以帮助您估算给定消息列表的标记数,以便控制文本长度和计费。请注意,不同模型的标记数限制可能会有所不同,因此在实际使用中请谨慎估算。

  • 如何使用PHP获取本机IPv4和IPv6地址

    在这个高度互联的时代,我们对于网络连接的依赖无处不在。无论是在服务器上运行网站,还是在树莓派上搭建物联网项目,获取本机的IPv4和IPv6地址都是至关重要的。这些地址是我们设备与互联网交流的通道,也是实现各种网络功能的基础。在这篇文章中,我们将探讨如何使用PHP编程语言获取本机的IPv4和IPv6地址,以便更好地管理网络连接和实现各种应用。

    步骤一:了解IPv4和IPv6的区别

    IPv4和IPv6都是用于标识网络上设备的地址协议,但它们有一些重要的区别。IPv4采用32位地址,而IPv6采用128位地址。IPv4地址已经枯竭,而IPv6地址则更为充足。在开始获取本机地址之前,了解这些基本知识对于正确选择适当的地址协议至关重要。

    步骤二:使用PHP编写获取IPv4地址的代码

    首先,我们将探讨如何使用PHP编写代码来获取本机的IPv4地址。PHP提供了一些内置函数和变量,可以轻松实现这一目标。以下是一个简单的示例:

    <?php
    $ipv4 = gethostbyname(gethostname());
    echo "本机IPv4地址是:" . $ipv4;
    ?>

    这段代码中,我们使用了gethostbyname()函数来获取主机名对应的IPv4地址,并将结果打印出来。这是一个简单而有效的方法来获取本机的IPv4地址。

    步骤三:使用PHP编写获取IPv6地址的代码

    如果你的网络环境支持IPv6,并且你需要获取IPv6地址,那么我们也可以使用PHP编写相应的代码。以下是一个示例:

    <?php
    $ipv6 = gethostbyname("ipv6.google.com");
    echo "本机IPv6地址是:" . $ipv6;
    ?>

    这段代码中,我们使用gethostbyname()函数来获取ipv6.google.com的IPv6地址。这个地址通常是本机的IPv6地址之一。请注意,获取IPv6地址可能需要确保网络环境已经启用了IPv6支持。

    步骤四:处理异常情况

    在获取IPv4和IPv6地址时,可能会遇到一些异常情况,例如网络连接断开或无法解析主机名。为了确保代码的稳定性,我们可以使用异常处理机制来捕获并处理这些异常。以下是一个简单的异常处理示例:

    <?php
    try {
        $ipv4 = gethostbyname(gethostname());
        echo "本机IPv4地址是:" . $ipv4;
    } catch (Exception $e) {
        echo "无法获取IPv4地址:" . $e->getMessage();
    }
    
    try {
        $ipv6 = gethostbyname("ipv6.google.com");
        echo "本机IPv6地址是:" . $ipv6;
    } catch (Exception $e) {
        echo "无法获取IPv6地址:" . $e->getMessage();
    }
    ?>

    这段代码中,我们使用trycatch块来捕获可能发生的异常,并提供相应的错误消息。

    步骤五:完善和优化代码

    获取本机的IPv4和IPv6地址只是一个简单的示例。在实际应用中,你可能需要更多的错误处理、地址验证和网络连接管理。此外,你还可以考虑将获取地址的功能封装成一个函数,以便在不同的项目中重复使用。

    结论

    获取本机的IPv4和IPv6地址是网络编程中的一个基本任务。使用PHP编程语言,我们可以轻松实现这一目标,无论是在服务器上还是在树莓派等嵌入式设备上。通过了解IPv4和IPv6的区别,编写相应的PHP代码,并进行异常处理,我们可以更好地管理网络连接并实现各种网络应用。

    无论你是一个网络管理员还是一个网络编程爱好者,掌握如何获取本机地址的技能都将为你在网络世界中的冒险提供强大的支持。

  • 如何使用ChatGPT撰写高质量论文

    让我们开始探讨如何充分利用ChatGPT,这个令人惊叹的人工智能助手,来撰写高质量的论文。假设你是一位繁忙的CEO,每天面对着繁重的工作任务,但你也有一个深藏的热情——写作。无论是技术博客还是学术论文,你都渴望能够创作出引人入胜、精彩纷呈的内容。然而,时间总是有限的,怎么才能在有限的时间内完成一篇高质量的论文呢?

    这就是ChatGPT的神奇之处。作为一位热爱编程和技术的CEO,你发现ChatGPT不仅是一个强大的人工智能助手,还是一个极具潜力的论文撰写伙伴。它可以帮助你从头到尾完成一篇高质量的论文,而且效率非常高。那么,接下来,让我们一起探讨如何使用ChatGPT来撰写高质量的论文吧。

    步骤一:确定论文主题和研究方向

    首要的步骤是明确论文的主题和研究方向。无论你是撰写技术博客还是学术论文,都需要一个清晰的焦点。ChatGPT可以成为你的顾问,帮助你了解当前领域的最新动态和热点问题,从而协助你确定具体的论文选题。这一步骤至关重要,因为一个好的选题是整个论文质量和吸引力的基石。

    步骤二:利用ChatGPT辅助选题和撰写综述

    ChatGPT不仅可以帮助你确定选题,还能在综述部分提供宝贵的帮助。建立一个与ChatGPT的对话模式,让它了解你的论文要求和目标,向它提出问题或请求建议。它会根据你的需求生成相关内容,协助你编写综述部分。这个过程可以节省大量的时间和精力。

    步骤三:生成摘要和大纲

    一旦选定了论文的主题和综述部分,接下来是生成摘要和大纲。ChatGPT可以轻松地帮你完成这一步骤。你可以让它生成论文的摘要,以及根据选题生成论文的大纲。这些都是论文写作的重要组成部分,可以协助你更好地组织和规划论文的结构。

    步骤四:生成和编辑内容

    现在,进入论文的正文部分。ChatGPT可以根据你提供的问题或主题,一段一段地生成论文的内容。你还可以设置字数限制,以确保生成的内容符合论文要求。然后,将生成的内容复制到Markdown格式中,进行进一步的编辑和排版。这一步骤可以帮助你确保论文的质量和逻辑性。

    步骤五:检查和审阅

    生成的内容虽然由ChatGPT完成,但仍需要你的检查和审阅。确保内容符合学术规范,没有语法错误和逻辑问题。此外,还可以通过论文查重系统进行验证,以确保论文的原创性。

    步骤六:润色和优化

    最后,根据你的个人喜好和写作风格,对论文进行润色和优化。完成格式排版和添加参考文献等细节。这一步骤可以让你的论文更加专业和引人注目。

    总结来说,利用ChatGPT撰写论文是一个高效且有趣的过程。它可以帮助你节省大量的时间和精力,同时保证论文的质量。然而,需要注意的是,ChatGPT在生成文献时可能会出现不准确的情况,所以在文献部分还是需要你自己来查询。另外,不同版本的ChatGPT可能会在撰写论文时有不同的效果和体验。

    最后,无论是技术博客还是学术论文,ChatGPT都可以成为你的得力助手,帮助你创作出高质量的内容。只要合理使用,它可以让你在有限的时间内完成令人满意的论文,同时也为你的写作梦想提供了更多的可能性。

  • 我的AskYourPDF使用心得

    在信息时代,我们经常需要处理各种文档和文件,而其中PDF文件占据了重要地位。有时候,我们需要从这些PDF文件中提取关键信息,但这并不总是一件容易的事情。近期,我发现了一个非常方便的工具——AskYourPDF插件,它让我能够更轻松地从PDF文档中获取所需信息。在本文中,我将分享我的使用心得,让你了解这个强大的工具以及一些使用中的注意事项。

    AskYourPDF插件的简介

    AskYourPDF插件的使用相对简单,主要包括以下四个步骤:

    1. 启动插件: 在ChatGPT中启动AskYourPDF插件。
    2. 获取文档ID: 访问Ask Your PDF官网并上传目标PDF文件以获取文档ID(doc_id)。
    3. 提取信息: 在ChatGPT中利用文档ID提取和分析PDF内容。
    4. 回答问题: 插件基于文件内容回答用户的后续问题。

    这个插件的核心功能是从PDF文档中提取信息,用户只需发送PDF链接或文档ID给ChatGPT,插件便能够下载PDF文件并回答用户的问题。

    AskYourPDF的优点

    AskYourPDF插件具有以下几个显著优点:

    1. 便捷性: 使用这个插件非常方便,只需要简单的几个步骤就能够提取所需信息。

    2. 文档ID系统: 插件使用文档ID来标识和提取文档,这使得处理多个PDF文件变得更加有序和高效。

    3. 信息提取: 插件能够有效地从PDF文档中提取文字信息,这对于需要处理大量文档的工作非常有帮助。

    使用中的一些挑战

    尽管AskYourPDF插件非常方便,但在实际使用过程中,我也遇到了一些挑战:

    1. 文件格式: 插件目前主要支持PDF格式,如果你需要处理其他格式的文件,可能需要先将其转换为PDF,这可能会稍微麻烦一些。

    2. 非语义搜索: 插件更适合语义搜索,对于一些非语义搜索类指令,例如“总结”和跨页信息聚合,插件可能无法完美响应。

    3. URL验证: 如果你提供了PDF链接,插件会首先验证其正确性,这可能会导致一些额外的等待时间。

    使用心得

    在我最近的工作中,AskYourPDF插件的使用频率逐渐增加。它帮助我轻松处理了大量的PDF文件,无需手动翻阅文档,节省了大量时间和精力。特别是对于需要频繁提取特定信息的任务,这个插件简直是一项福音。

    不仅如此,插件的文档ID系统也为我带来了极大的便利。我可以轻松管理多个文档,快速定位需要的文件,而不必担心混淆或丢失。

    当然,就像任何工具一样,AskYourPDF也有其局限性。对于非标准的搜索请求和非PDF格式文件的处理,我仍然需要寻找其他解决方案。不过,这并不影响它在核心功能方面的表现。

    结论

    总的来说,AskYourPDF是一个非常实用的工具,特别适合需要从PDF文档中提取信息的用户。它的便捷性和文档ID系统使得处理文档变得更加高效。虽然在某些特定情况下可能会遇到一些挑战,但它的核心功能表现良好,能够帮助用户轻松获取PDF文档中的关键信息。

    如果你也常常需要处理PDF文件,我强烈推荐你尝试一下AskYourPDF插件,相信你会像我一样受益匪浅。

  • 制作3D打印和树莓派驱动的ChatGPT机器人教程

    你是否曾经想过拥有一个能够与你互动的ChatGPT机器人,而且它还拥有可爱的外观?那么,你来对地方了!在这篇教程中,我们将向你展示如何制作一个由3D打印和树莓派驱动的ChatGPT机器人。这个机器人将能够回答你的问题、进行有趣的对话,而且还有一个可爱的外壳,使它看起来像一只机械熊一样。

    步骤1:3D打印机器人外壳和组件

    首先,我们需要制作机器人的外壳和组件。根据Adafruit Learning System提供的指南,你需要打印以下部分:

    • 主机箱: 1 x Case Top.stl,1 x Case Bottom.stl
    • 扬声器固定器: 如果使用4mm 0.25W的扬声器,则需要2 x 4mm Thick Speaker Retainer.stl;如果升级到Adafruit 2mm 0.5W的扬声器,则需要2 x 2mm Thick Speaker Retainer.stl【14†source】.

    确保你的3D打印机和材料准备好,并按照指南的建议进行打印。一旦完成,你将获得一个机器人的基本外壳,接下来,我们将在内部安装树莓派和其他组件。

    步骤2:安装和配置树莓派

    在机器人外壳中安装树莓派是关键的一步。以下是详细的操作指南:

    1. 安装64位的Raspberry Pi OS Lite,因为OpenAI库只能在此版本上安装。
    2. 为音频系统和驱动程序安装额外的库,例如libpulse-dev, pulseaudio, 和 apulse
    3. 如果安装了MAX98357音频芯片,需要按照指南进行额外的配置【18†source】.

    完成这些步骤后,你的树莓派将准备好用于机器人的音频和控制系统。

    步骤3:编写和运行代码

    现在,让我们来看看在树莓派上运行的代码。这个代码涉及到Azure认知服务、语音识别库和OpenAI库,以及一些用于控制机器人动作的参数设置。你可以从Adafruit Learning System下载项目包,里面包含了完整的代码【22†source】.

    在运行代码之前,请确保你已经按照指南配置好了所需的API密钥和设置。这将确保机器人能够正常运行并进行语音识别和回答问题。

    步骤4:集成ChatGPT

    最后,我们来看看如何集成ChatGPT,使机器人能够进行智能对话。参考Pi My Life Up的指南,了解如何在树莓派上交互使用ChatGPT API【17†source】.

    这个步骤将使你的机器人能够回答各种问题,并进行有趣的对话。你可以根据自己的需求和喜好配置ChatGPT的行为。

    结尾

    通过完成以上步骤,你将拥有一个令人印象深刻的3D打印和树莓派驱动的ChatGPT机器人。你可以为它编写自定义的对话脚本,让它成为你的智能伴侣。

    这个项目不仅是一个有趣的技术挑战,还可以让你学习如何使用树莓派和API来创建强大的人工智能应用程序。希望你享受制作和与你的机器人互动的过程!