You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:48:24