GPT4_Retrieval_Augmentation

本文展示如何结合Pinecone向量数据库和GPT-4模型进行知识增强的问答。首先,从LangChain文档中提取数据,将其分块并编码。接着,使用text-embedding-ada-002模型创建嵌入向量,并在Pinecone上建立索引。最后,通过查询Pinecone检索相关上下文,用GPT-4生成基于真实数据的答案,减少模型的‘幻觉’现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Retrieval Augmentation for GPT-4 using Pinecone

Fixing LLMs that Hallucinate

In this notebook we will learn how to query relevant contexts to our queries from Pinecone, and pass these to a GPT-4 model to generate an answer backed by real data sources.

GPT-4 is a big step up from previous OpenAI completion models. It also exclusively uses the ChatCompletion endpoint, so we must use it in a slightly different way to usual. However, the power of the model makes the change worthwhile, particularly when augmented with an external knowledge base like the Pinecone vector database.

Required installs for this notebook are:

!pip install -qU bs4 tiktoken openai langchain pinecone-client[grpc]

Preparing the Data

In this example, we will download the LangChain docs from langchain.readthedocs.io/. We get all .html files located on the site like so:

!wget -r -A.html -P rtdocs https://python.langchain.com/en/latest/

This downloads all HTML into the rtdocs directory. Now we can use LangChain itself to process these docs. We do this using the ReadTheDocsLoader like so:

from langchain.document_loaders import ReadTheDocsLoader#读取文件的模块

loader = ReadTheDocsLoader('rtdocs')
docs = loader.load()
len(docs)
This leaves us with hundreds of processed doc pages. Let's take a look at the format each one contains:
docs[0]
We access the plaintext page content like so:
print(docs[0].page_content)
print(docs[5].page_content)
We can also find the source of each document:
docs[5].metadata['source'].replace('rtdocs/', 'https://')
We can use these to create our `data` list:
data = []

for doc in docs:
    data.append({
   
   
        'url': doc.metadata['source'].replace('rtdocs/', 'https://'),
        'text': doc.page_content
    })
data[3]

It’s pretty ugly but it’s good enough for now. Let’s see how we can process all of these. We will chunk everything into ~400 token chunks, we can do this easily with langchain and tiktoken:

import tiktoken


tokenizer = tiktoken.get_encoding('p50k_base')

# create the length function
def tiktoken_len(text):
    tokens = tokenizer.encode(
        text,
        disallowed_special=()
    
<think>嗯,用户给了一段看起来像是嵌入式系统中的C代码片段,特别是涉及到定时器和中断的部分。我需要先理解这段代码的结构和功能。首先,用户用条件编译指令#ifdef TEST_WITH_GPT包裹了一些函数调用,这部分代码只有在定义了TEST_WITH_GPT宏时才会被编译。这可能用于测试或者特定的硬件配置。 接下来,用户调用了Gpt_Init函数,传入GptConfig的地址。这应该是初始化通用定时器模块的配置,设置定时器的工作模式、时钟源等参数。然后,Gpt_StartTimer被调用了两次,分别针对GPT_TIMER_T3_ID和GPT_TIMER_T6_ID,并传入了初始计数值。这可能是在启动这两个定时器,并设置它们的初始中断计数器值。最后,调用了IfxCpu_enableInterrupts()来启用CPU的中断,这样定时器中断就能被触发了。 用户可能想知道这段代码的具体作用,或者是在调试时遇到了问题,比如定时器没有按预期工作。需要解释每个函数的作用,条件编译的意义,以及整个代码流程。另外,用户可能对嵌入式系统不太熟悉,所以需要用比较易懂的语言,避免太专业的术语,同时确保解释准确。 需要检查是否有遗漏的部分,比如GptConfig的配置内容,或者定时器ID的具体含义,但用户提供的代码中没有这些细节,可能需要提醒用户如果需要更详细的解释,应提供更多上下文。另外,注意代码中的IfxCpu_enableInterrupts()函数可能属于特定的硬件库,比如Infineon的Aurix系列,可能需要提到这一点。 最后,按照用户的要求,结构要清晰,分步骤解释,使用中文,并且注意LaTeX格式的正确应用。虽然这段代码中没有数学公式,但如果有变量或配置参数,可能需要用行内公式格式。不过当前情况下可能不需要,所以重点放在代码分析上。</think>让我们逐步分析这段代码的结构和功能: 1. **条件编译指令** `#if TEST_WITH_GPT` 到 `#endif` 是预处理器指令,表示: - 当定义了 `TEST_WITH_GPT` 宏时,才会编译包裹的代码 - 常用于功能模块的调试开关或平台适配 2. **GPT模块初始化** `Gpt_Init(&GptConfig);` 表示: - 调用定时器模块的初始化函数 - 传入配置结构体 `GptConfig` 的指针 - 该配置应包含定时器工作模式、时钟源等参数(需查看具体定义) 3. **定时器启动配置** ```c Gpt_StartTimer(GPT_TIMER_T3_ID, GPT_ISR_COUNTER_INIT_VALUE); Gpt_StartTimer(GPT_TIMER_T6_ID, GPT_ISR_COUNTER_INIT_VALUE); ``` - 启动两个定时器通道(T3 和 T6) - `GPT_ISR_COUNTER_INIT_VALUE` 是中断计数器的初始值(可能表示定时周期) - 该函数可能配置了定时器重载值、中断优先级等参数 4. **全局中断使能** `IfxCpu_enableInterrupts();` 表示: - 调用特定CPU架构的中断使能函数(常见于Infineon Aurix系列MCU) - 开启全局中断开关,允许定时器中断触发 代码流程图: ```plaintext ┌──────────────┐ │ 条件编译检测 │ └──────┬───────┘ │ ┌──────────────▼──────────────┐ │ GPT模块初始化 (基础配置) │ └──────────────┬──────────────┘ │ ┌────────▼────────┐ │ 启动定时器T3/T6 │ └────────┬────────┘ │ ┌───────▼───────┐ │ 使能全局中断 │ └───────────────┘ ``` 注意要点: 1. 该代码段属于底层驱动层,通常与硬件寄存器直接交互 2. `Gpt_StartTimer` 的参数需要与硬件定时器资源对应匹配 3. 中断服务函数(ISR)需要单独实现(代码中未体现) 4. 需要确保 `GPT_ISR_COUNTER_INIT_VALUE` 的数值与时钟频率匹配才能获得预期定时周期 实际开发中需要配合: 1. 中断服务例程的注册 2. 定时器具体模式配置(PWM/输入捕获/输出比较等) 3. 时钟树配置(确保定时器时钟源正确) 4. 可能需要的DMA配置(如果涉及数据传输) 建议查阅相关芯片的: 1. GPT(General Purpose Timer)模块手册 2. 中断控制器文档 3. 系统时钟配置说明 以获取完整的实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值