如何防止人工智能模型在预定义语料库之外生成自己的答案?

问题描述 投票:0回答:1

所以我正在使用 Python 开发一个聊天机器人。我集成了一个名为 Word2Vec 的矢量数据库,并使用 Hugging Face 中的 Zephyr 模型。我创建了一个非常简单的文本文件语料库,我希望我的模型在响应时能够遍历该语料库。这实际上正在按预期工作。但是,当语料库中没有有关用户输入的详细信息时,就会出现问题。

例如,假设我的语料库中有一个开始日期。当我向模型询问开始日期时,它会提供此信息。但是,如果我的语料库中没有有关法律团队的信息,并且我询问模型,它会生成一个答案:“是的,有一个法律部门。”

您有什么建议来阻止这种情况并将我的模型仅限于语料库?

感谢任何建议并提前致谢。”

我尝试给出特定的关键字。但这是不实用和可扩展的。


from langchain import HuggingFaceHub, PromptTemplate, LLMChain
import gensim.downloader as api

word_vectors = api.load("word2vec-google-news-300")

template = """
{corpus_text}
give an answer to the {query}:
{query}
"""

prompt = PromptTemplate(template=template, input_variables=['corpus_text', 'query'])

model_id = "HuggingFaceH4/zephyr-7b-beta"

conv_model = HuggingFaceHub(
    huggingfacehub_api_token="12345",  
    repo_id=model_id,
    model_kwargs={"temperature": 0.1, "max_new_tokens": 1000}
)

conv_chain = LLMChain(llm=conv_model,
                      prompt=prompt,
                      verbose=True)

corpus_file = r/myfile.txt

with open(corpus_file, "r", encoding="utf-8") as file:
    corpus_text = file.read()

while True:
    user_input = input("You: ")
    
    
    generated_prompt = prompt.template.format(corpus_text=corpus_text, query=user_input)
    
    
    result = conv_chain.run({"query": user_input, "corpus_text": corpus_text})
    
    print("Model:", result)
python artificial-intelligence chatbot huggingface-transformers gensim
1个回答
0
投票

您的代码显示了一堆加载的词向量 - 2012 年左右的 4GB GoogleNews 向量 - 但对象

word_vectors
从未用于任何用途,因此不会对您的响应产生任何影响。如果您打算使用它以“检索增强生成”(RAG) 方式帮助选择语料库的某些部分,那么这种情况不会发生。更进一步:简单的单词向量对于较长文本的建模来说是一个相当粗糙且薄弱的基础。

你的提示

template
看起来也有点混乱。您包含整个语料库——可能有数千、数万或数十万个单词? – 在顶部,然后重复
query
两次。

例如,如果你的语料库是句子

"Math is hard, let's go shopping."
并且查询是
"What is 2 + 2?"
,那么你的模板实际传递给LLM的是:

"""
Math is hard, let's go shopping.
give an answer to the What is 2 + 2?:
What is 2 + 2?
"""

综上所述:

法学硕士本质上容易混淆看似合理的文本(“幻觉”),这些文本并不完全符合他们的培训材料或上下文窗口中的书面说明和材料。对于较小的模型和较高的温度,这可能是一个更大的问题。

没有任何保证,但一些策略可能会有所帮助:

  1. 确保最相关的信息在生成之前不会“太远”。

IIUC – 这可能是一个模糊的近似,而不是字面上的事实 – 像 Zephyr-7b-beta 这样的 Mistral-7b 曲调有一个大约 4k 个标记的“上下文窗口”,其中每个标记都是介于单词和有意义之间的东西子词。 (所以:这可能少于 4k 字。)

这意味着生成只能明确地解决提示中最后约 4k 个单词(加上 LLM 的内在倾向),加上一些更模糊的早期上下文保留感(随着距离的增加而迅速消失)。

因此,每当您的查询需要在语料库中返回超过 4k 个单词的信息时,LLM 就会比从语料库中推断更多的猜测/幻觉。

RAG 的要点是确保在 LLM 需要之前向其提供最佳参考信息,因此它位于上下文窗口中。因此,如果您升级代码以将语料库中最相关的(通过某种语义相似性度量)摘录放入提示中,就在生成之前,您可能会获得更好的结果。

  1. 使用更大的模型、有效上下文更长的模型,或者调整生成温度。您必须寻找最适合您的特定域、资源限制以及典型查询和所需响应的方法。

  2. 堆叠技术,例如使用第二个 LLM 通行证(本身可能通过一些语料库摘录检索来增强)来检查答案是否与您的规范参考片段相矛盾,或选择几个替代世代中的哪一个是最好的。

最终,如果你希望你的系统说出语料库中明确的内容,那么法学硕士可能会矫枉过正,而且容易产生幻觉,无法满足你的需求。

您可能只想将语料库分成块/范围,然后使用一些 LLM 之前的信息检索(关键字搜索、语义相似性搜索等)来仅回显最佳的、未更改的、规范的文本块。

(这样的系统有时可以使用 LLM 技术进行改进,即使 LLM 不直接组成答案。例如,一种名为“HyDE”的技术使用 LLM 为您从未遇到过的查询生成候选答案向用户展示,或者关心他们是否错了 - 他们只是用来在您验证的答案中查找类似文本。)

© www.soinside.com 2019 - 2024. All rights reserved.