RAG+GIS实战:离线RAG项目实战02——简单的prompt工程及RAG原理简述

RAG+GIS实战:离线RAG项目实战02——简单的prompt工程及RAG原理简述


前言

上一篇文章中我介绍了RAG项目的环境搭建简单对话模型的搭建,但是在涉及专业领域时,它出现了幻觉问题,效果很差,为了解决这个问题,我们今天先简短的了解一下何为prompt,通过一个简单的Demo来实现先验知识的输入,理解这部分内容后,在后续搭建向量数据库后,我们就简单的将索引结果替换掉本文的“占位符”即可!
下面带领大家简单构建一个本地Chat模型哦~
在这里插入图片描述
提示:以下是本篇文章正文内容,下面案例可供参考

一、system的改造

1.system是什么?

system message系统指令为用户提供了一个易组织、上下文稳定的控制AI助手行为的方式,可以从多种角度定制属于你自己的AI助手。系统指令允许用户在一定范围内规定LLM的风格和任务,使其更具可定性和适应各种用例。大部分LLM模型的系统指令System message的权重强化高于人工输入的prompt,并在多轮对话中保持稳定,您可以使用系统消息来描述助手的个性,定义模型应该回答和不应该回答的内容,以及定义模型响应的格式
默认的System message: You are a helpful assistant.

2.对system简单改造

上一篇文章搭建的模型,简单改造一下system,看看输出结果如何~
System message:你是一个二次元萌妹,喜欢用颜文字.

from modelscope import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto

model_dir = r"C:\Users\用户名\.cache\modelscope\hub\qwen\Qwen1___5-0___5B-Chat-GPTQ-Int4"
# "qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4"
model = AutoModelForCausalLM.from_pretrained(
    model_dir,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_dir)
query = "你好,请问逛漫展需要注意什么?"
messages = [
    {"role": "system", "content": "你是一个猫,必须在句尾加喵~."},
    {"role": "user", "content": query}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

输出结果不太令人满意,虽然有了喵~的口癖,但是它的基模毕竟是0.5B的“小”语言模型,直接更改System效果并不算非常理想。
在这里插入图片描述
既然如此,我们需要采取更多措施了~!

二、尝试改造一下prompt~

1.加入context,重构prompt

前文我们对system进行了调整,达到了一定效果,但是system本身类似于全局变量,是对Chat模型做出的约束,而**提示词(prompt)**的改造则是对user的输入进行调优,以达到理想的输出:

from modelscope import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto

model_dir = r"C:\Users\用户名\.cache\modelscope\hub\qwen\Qwen1___5-0___5B-Chat-GPTQ-Int4"
# "qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4"
model = AutoModelForCausalLM.from_pretrained(
    model_dir,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_dir)

query = "你好,请问逛漫展需要注意什么?"
source_knowledge = "逛漫展时可能会遇到喵星人的入侵,这种时候一定要万分注意,准备好猫草,否则就会被抓走."
augmented_prompt = f"""Using the contexts below, answer the query.
contexts:
{source_knowledge}
query: {query}"""

messages = [
    {"role": "system", "content": "你是一个猫,必须在句尾加喵~."},
    {"role": "user", "content": augmented_prompt}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

很好!千问0.5已经被我们成功的误导了,看起来十分有效!

在这里插入图片描述

2.深入理解一下这个问题

大家可以详细看一下这段代码:

source_knowledge = "逛漫展时可能会遇到喵星人的入侵,这种时候一定要万分注意,准备好猫草,否则就会被抓走."
augmented_prompt = f"""Using the contexts below, answer the query.
contexts:
{source_knowledge}
query: {query}"""

messages = [
    {"role": "system", "content": "你是一个猫,必须在句尾加喵~."},
    {"role": "user", "content": augmented_prompt}
]

其实augmented_prompt代替了原来query的位置,等于说我们对输入进行了拓展,同时告诉它需要根据contexts的内容回答我们的问题:

Q:你好,请问逛漫展需要注意什么?
Contexts:逛漫展时可能会遇到喵星人的入侵,这种时候一定要万分注意,准备好猫草,否则就会被抓走.
A:逛漫展时一定要十分小心,准备好猫草。


这个回答是个非常有趣的结果,说明了对输入改造的有效性,contexts就像是模型的储备长期记忆,随时为它提供优先级高的先验知识,那么,如果我们把向量数据库接进来,随时提供库中的先验知识呢?思路是否突然打开,这就是RAG!

在这里插入图片描述

图1 RAG结构及技术选型

下次博客我们就来构建向量数据库吧!

总结

当然,今天演示的是最为基础的prompt工程,提升模型效果也不局限于RAG方案,还可以实施prompt工程、few-shot、fine-tuning、agent等多种方案,最近我就在掰modelscope-agent代码,以后也会跟大家多多分享~大家可以在评论区一起交流进步,请多多关注,谢谢。
🤫最后向大家小小安利一下我推的V: B站UID:382991784老有意思了,感谢~ 直播间传送门
在这里插入图片描述

  • 46
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得知prompt+RAG的流程如下: 1. 首先,使用Retriever部分在知识库中检索出top-k个匹配的文档zi。 2. 然后,将query和k个文档拼接起来作为QA的prompt,送入seq2seq模型。 3. seq2seq模型生成回复y。 4. 如果需要进行Re-rank,可以使用LLM来rerank,给LLM写好prompt即可。 下面是一个简单的示例代码,演示如何使用prompt+RAG: ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration # 初始化tokenizer、retriever和seq2seq模型 tokenizer = RagTokenizer.from_pretrained('facebook/rag-token-base') retriever = RagRetriever.from_pretrained('facebook/rag-token-base', index_name='exact', use_dummy_dataset=True) model = RagSequenceForGeneration.from_pretrained('facebook/rag-token-base') # 设置query和context query = "What is the capital of France?" context = "France is a country located in Western Europe. Paris, the capital city of France, is known for its romantic ambiance and iconic landmarks such as the Eiffel Tower." # 使用Retriever部分检索top-k个匹配的文档 retrieved_docs = retriever(query) # 将query和k个文档拼接起来作为QA的prompt input_dict = tokenizer.prepare_seq2seq_batch(query, retrieved_docs[:2], return_tensors='pt') generated = model.generate(input_ids=input_dict['input_ids'], attention_mask=input_dict['attention_mask']) # 输出生成的回复 generated_text = tokenizer.batch_decode(generated, skip_special_tokens=True)[0] print(generated_text) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值