构建RAG应用-day02: prompt技巧总结 llamaIndex入门

news/2024/5/4 13:28:46

常见 prompt 技巧

# 两个原则
1.明确且具体的指令具体的指令不等于短指令,长指令往往能提供更高的清晰度1.使用分隔符划分不同的文本内容2.请求模型输出HTML或者JSON格式3.使用类似于异常捕获的理念,教会模型处理文本中遇到的不同情况4.给模型提供少量示例,相当于让模型模仿着示例来进行任务。2.给模型时间去思考让更多的计算资源分配到我们想让模型做的事情上。1.对一个复杂任务,将其拆分为多个步骤,这一目的是给模型提供更高的清晰度。对于每个步骤还可以再次细化,直到模型给出理想的结果。2.不要让模型短时间的去下一个结论,而是请求模型在提供最终答案之前进行一系列相关的推理,然后再给出结论。# 幻觉
模型在训练过程中接触了大量的知识,它并没有完全记住所见的信息,因此它并不很清楚自己知识的边界。这意味着它可能会尝试回答有关晦涩主题的问题,并编造听起来合理但实际上并不正确的答案。我们称这些编造的想法为幻觉。
也就是说对于模型不清楚的知识,模型更倾向于一本正经的胡说八道。# prompt技巧:
结构化输入:角色 + 场景 + 思维链 + 回复示例# 少样本提示
few-shot是普通的禁止指令的上位替代。与其告诉模型不能做什么,不如提供示例,告诉模型怎么做。如果一个例子的效果不好,可以尝试用多个。# 思维链:
相当于把问题的解法给llm
Let's think step by step.# ReAct 
让模型去推理,推理的过程中自己决定调用哪个工具。再把工具结果告诉模型,模型再次推理下一步。
可以通过某个参数,让大模型输出xx内容时,停下来。# ReAct类比程序员的开发过程
需求 写代码 运行代码看结果 改代码 运行代码看结果
think react think react 

llamaIndex

LlamaIndex 是一个框架,用于构建称为 检索增强生成 (RAG) 的系统。
构建RAG系统,需要先将文本转化为向量表示,(这个过程被llamaIndex称为索引),然后将用户的问题(query)进行向量相似度计算(这个过程被llamaindex称为查询),匹配出和用户问题最相关的信息,最后传入大模型,以提高llm的输出效果。

入门示例 一篇文章的RAG

安装: pip install llama-index

import openai
import logging
import sys
import os.path
from llama_index.core import (VectorStoreIndex,SimpleDirectoryReader,StorageContext,load_index_from_storage,
)# https://github.com/chatanywhere/GPT_API_free
openai.base_url = 'https://api.chatanywhere.tech/v1'# 使用日志查看内部详细行为
logging.basicConfig(stream=sys.stdout, level=logging.INFO)  # INFO/DEBUG
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))# 检查是否已经存在存储空间
PERSIST_DIR = "./storage"
if not os.path.exists(PERSIST_DIR):# 加载data目录下的文章documents = SimpleDirectoryReader("data").load_data()# 进行embeddingindex = VectorStoreIndex.from_documents(documents)# 储存起来以后使用index.storage_context.persist(persist_dir=PERSIST_DIR)
else:# 加载现有索引storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)index = load_index_from_storage(storage_context)# 初始化搜索引擎
query_engine = index.as_query_engine()
# 搜索 "作者的成长经历是什么?" 这里向大模型提问了,显然: 默认情况下,LlamaIndex 带有一组经过实战考验的内置提示
response = query_engine.query("What did the author do growing up?")
# The author worked on writing short stories and programming, particularly on an IBM 1401 computer in 9th grade using an early version of Fortran. Later, with the availability of microcomputers, the author continued programming, eventually getting a TRS-80 computer and writing simple games and a word processor.
# 作者曾写过短篇小说和编程,特别是在9年级的IBM 1401计算机上使用早期版本的Fortran。后来,随着微型计算机的出现,作者继续编程,最终得到了一台TRS-80计算机,并编写了简单的游戏和文字处理器。
print(response)

大概有如下步骤:读取文件 - 分块 - 将文本向量化 - 匹配与问题最相关的文本 - 带着这些文本和gpt聊天

image-20240420234537636

查看存储的内容:

image-20240420235404270

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/22769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

结对编程——小学四则运算练习题小程序

程序要求如下: 小学老师要每周给同学出300道四则运算练习题。两个运算符,100 以内的数字,不需要写答案。 需要检查答案是否正确,并且保证答案在 0..1000 之间。 本程序有Java语言实现:点击查看代码 import java.util.*;public class Practice {private Random random = ne…

6.常见寄存器和指令

一.寄存器 1.通用寄存器2.特殊寄存器stvec(Supervisor Trap Vector) 内核在这里写入trap处理程序的地址;RISC-V会跳转到stvec中的地址来处理trap,xv6的stvec就是trampoline page的起始地址sepc 发生trap时,RISC-V将当前的pc值存储到这里(pc随后会被stvec中的值覆盖)。从trap…

2.Lab-8 locks

Memory allocator (moderate) 代码地址 https://github.com/INnoVationv2/xv6-labs-2023/commit/6a93f5a9a5fca0627f9d44f185a33f30f3b8cd16 Buffer cache (hard) 创建多个桶 #define NBUCKET 13 struct {struct buf buf[NBUF];struct spinlock bucket_lock[NBUCKET];struct bu…

2.Lab-6 Multithreading

Uthread: switching between threads (moderate) Riscv32 Callee寄存器Name ABI Name Description Saverx0 zero Zero -x1 ra Return address Callerx2 sp Stack pointer Calleex3 gp Global pointer -x4 tp Thread pointer -x5-x7 t0-t2 Temporary registers Callerx8 s0/fp S…

2.CH-4文档学习笔记

一、trap简介 三类 trap系统调用:用户程序执行ecall指令要求内核为其提供服务 异常:(用户或内核)指令做了一些非法的事情,例如除以零或使用无效的虚拟地址; 设备中断,一个设备,例如当磁盘硬件完成读或写请求时,向系统表明需要处理。trap执行流程 1. 强制将控制权转移到内…

3.LAB-5 COW

LAB-5 COW 主要是修改fork和缺页中断处理程序 以前fork时,会直接复制原进程的页表内容到新页表,具体过程是 ​ 对于原页表中的每一页,malloc一个新页,然后复制数据到新页,最后把这一页映射到新页表 现在进行修改: 1. fork复制页表对于新进程,为其创建新页表 直接复用旧页…

南昌航空大学-23201406-第一次OOP博客作业

这个Blog,主要是为了将在面向对象的程序设计课程(Java)中的前三次pta题目集进行一个总结。 一、前言总结三次题目集的题目情况关于题目集 这三次题目集的题量都不大,主要内容都集中在最后的判题程序中。且三次的难度循序渐进,充分起到了锻炼的作用。 题目本身这三次题目集…

30 天精通 RxJS (26):简易实作 Observable(一)

因为实在太多读者在问要如何实作 Observable,所以特别调整了本系列文章最后几篇的内容,空出一天的位置来写如何简易实作 Observable。为什么是简易实作而不完整实作呢? 当然这个系列的文章是希望读者能学会如何使用 RxJS,而 实作 Observable 其实只是帮助我们理解 Observab…