如何限制基于Zephyr模型的Python聊天机器人仅使用自定义语料回答?
解决方案:限制Zephyr模型仅基于自定义语料回答
要解决模型编造语料外信息的问题,核心是明确约束模型的回答范围+通过检索增强生成(RAG)精准匹配相关语料,具体方案如下:
1. 优化提示词,明确回答规则
直接在prompt中强制模型只能使用提供的语料,无相关信息时必须返回固定话术,从指令层面约束幻觉。
修改后的prompt模板:
template = """ 以下是唯一可用于回答问题的参考语料: {retrieved_docs} 请严格基于上述语料回答用户的问题:{query} 如果语料中没有与问题相关的信息,请直接回答“我无法回答这个问题,因为相关信息不在提供的语料中”,绝对不要编造任何内容。 """
2. 引入检索增强生成(RAG)
直接将整个语料塞进prompt会导致模型注意力分散,且大语料会超出token限制。通过RAG先检索语料中与用户问题最相关的片段,再喂给模型,既能提升回答精准度,也能通过检索结果是否为空判断是否要返回“无法回答”。
修改后的完整代码
from langchain import HuggingFaceHub, PromptTemplate, LLMChain from langchain.text_splitter import CharacterTextSplitter from langchain.vectorstores import FAISS from langchain.embeddings import GensimEmbeddings import gensim.downloader as api # 加载Word2Vec模型作为嵌入工具 word_vectors = api.load("word2vec-google-news-300") embeddings = GensimEmbeddings(model=word_vectors) # 加载并分割语料 corpus_file = r"myfile.txt" with open(corpus_file, "r", encoding="utf-8") as file: corpus_text = file.read() # 将语料分割成小文档块,提升检索精度 text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50) docs = text_splitter.split_text(corpus_text) # 创建向量存储,用于检索相关语料 db = FAISS.from_texts(docs, embeddings) # 定义带明确约束的prompt模板 template = """ 以下是唯一可用于回答问题的参考语料: {retrieved_docs} 请严格基于上述语料回答用户的问题:{query} 如果语料中没有与问题相关的信息,请直接回答“我无法回答这个问题,因为相关信息不在提供的语料中”,绝对不要编造任何内容。 """ prompt = PromptTemplate(template=template, input_variables=['retrieved_docs', 'query']) # 初始化Zephyr模型 model_id = "HuggingFaceH4/zephyr-7b-beta" conv_model = HuggingFaceHub( huggingfacehub_api_token="12345", repo_id=model_id, model_kwargs={"temperature": 0.0, "max_new_tokens": 1000} # 进一步降低随机性减少幻觉 ) conv_chain = LLMChain(llm=conv_model, prompt=prompt, verbose=True) # 对话循环 while True: user_input = input("You: ") # 检索与问题相关的语料片段 retrieved_docs = db.similarity_search(user_input, k=3) # 取最相关的3个片段 retrieved_text = "\n".join([doc.page_content for doc in retrieved_docs]) # 生成回答 result = conv_chain.run({"query": user_input, "retrieved_docs": retrieved_text}) print("Model:", result)
3. 额外优化建议
- 降低temperature:设为0.0进一步减少模型随机性,降低编造概率。
- 加入相关性阈值判断:检索后计算问题与文档的向量相似度,低于阈值直接返回“无法回答”,避免模型基于无关内容编造。
- 优化文本分割:使用
RecursiveCharacterTextSplitter替代基础分割工具,适配不同结构的语料(如段落、列表)。
内容的提问来源于stack exchange,提问作者Teba42
相关产品推荐
相关产品推荐

