成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

減少LLM幻覺的五大技巧和方法 原創

發布于 2024-12-31 07:55
瀏覽
0收藏

本文介紹了使用LangGraph減少LLM幻覺的簡單技巧。

如果你使用過LLM,就知道它們有時會產生幻覺。這意味著它們生成的文本要么毫無意義,要么與輸入數據相矛盾。這個常見的問題可能會損害基于LLM的應用程序的可靠性。

我們在這篇文章中將探討一些簡單的技巧來降低產生幻覺的可能性。遵循這些技巧,你有望提高AI應用程序的準確性。

幻覺有多種類型:

  • 內在幻覺:LLM的響應與用戶提供的上下文相矛盾。響應在當前上下文中是錯誤的,而且這種錯誤是可驗證的。
  • 外在幻覺:LLM的響應無法使用用戶提供的上下文加以驗證。響應可能是錯誤的,也可能不是錯誤的,但我們沒有辦法使用當前的上下文來確認。
  • 不連貫的幻覺:LLM的響應并未回答問題或沒有意義。LLM無法遵循指示。

我們在這篇文章中將針對上述所有類型作下闡述。

我們將列出一系列以不同方式減少幻覺的技巧和方法。

技巧1:使用錨定

錨定是指要求LLM完成任務時,在LLM的輸入中使用領域內相關的附加上下文。這為LLM提供了正確回答問題所需的信息,并降低了產生幻覺的可能性。這是我們使用檢索增強生成(RAG)的原因之一。

比如說,問LLM一個數學問題,或者問同樣的問題,同時為它提供一本數學書的相關章節,會生成不一樣的結果,第二種選擇更有可能是正確的。

以下是我在之前的教程中介紹此類實現的示例,在提出問題時提供了從文檔提取的上下文信息:

??https://towardsdatascience.com/build-a-document-ai-pipeline-for-any-type-of-pdf-with-gemini-9221c8e143db??。

技巧2:使用結構化輸出

使用結構化輸出意味著強制LLM輸出有效的JSON或YAML文本,便于你減少無用的漫談,從LLM獲得“切中要點”的回答。它還有助于下一個技巧,因為它使LLM響應更容易驗證。

你可以使用Gemini的API來做到這點:

import json

import google.generativeai as genai
from pydantic import BaseModel, Field

from document_ai_agents.schema_utils import prepare_schema_for_gemini


class Answer(BaseModel):
    answer: str = Field(..., description="Your Answer.")


model = genai.GenerativeModel("gemini-1.5-flash-002")

answer_schema = prepare_schema_for_gemini(Answer)


question = "List all the reasons why LLM hallucinate"

context = (
    "LLM hallucination refers to the phenomenon where large language models generate plausible-sounding but"
    " factually incorrect or nonsensical information. This can occur due to various factors, including biases"
    " in the training data, the inherent limitations of the model's understanding of the real world, and the "
    "model's tendency to prioritize fluency and coherence over accuracy."
)

messages = (
    [context]
    + [
        f"Answer this question: {question}",
    ]
    + [
        f"Use this schema for your answer: {answer_schema}",
    ]
)

response = model.generate_content(
    messages,
    generation_config={
        "response_mime_type": "application/json",
        "response_schema": answer_schema,
        "temperature": 0.0,
    },
)

response = Answer(**json.loads(response.text))

print(f"{response.answer=}")

其中“prepare_schema_for_gemini”是一個效用函數,它準備模式以匹配Gemini的奇特需求。你可以在這里找到它的定義:??https://github.com/CVxTz/document_ai_agents/blob/498d8ee6e8597f8ba43b336c64178d186461dba0/document_ai_agents/schema_utils.py#L38。??

這段代碼定義了Pydantic模式,并將該模式作為查詢的一部分發送到“response_schema”字段。這迫使LLM在響應中遵循此模式,并使輸出解析起來更容易。

技巧3:使用思維鏈和更好的提示

有時候,在給出最終回答之前,給LLM足夠的空間來思考響應,有助于生成更高質量的響應。這種技術被稱為思維鏈,因有效、易于實現而被廣泛使用。

如果LLM找不到足夠的上下文來生成高質量的響應,我們還可以明確要求它以“N/A”回答。這將給它一個簡單的出路,而不是試圖回答它不知道怎么回答的問題。

比如說,不妨看看這個簡單的問題和上下文:

上下文

托馬斯?杰斐遜(1743年4月13日-1826年7月4日),美國政治家、種植園主、外交官、律師、建筑師、哲學家和開國元勛,1801年至1809年擔任美國第三任總統,他是《獨立宣言》的主要起草者。在美國獨立戰爭之后,在1801年成為總統之前,杰斐遜是華盛頓領導班子的第一位美國國務卿,然后是亞當斯領導班子的第二副總統。杰斐遜是支持民主、共和主義和自然權利的主要倡導者,他在州、國家和國際等層面制定了形成性的文件和決定。(來源:維基百科)

問題

戴維斯?杰斐遜是哪一年去世的?

一種天真的方法會生成:

響應

answer= '1826年 '

這顯然是錯誤的,因為杰斐遜?戴維斯在上下文中根本沒有被提及。托馬斯?杰斐遜死于1826年。

如果我們將響應的模式改為使用思維鏈:

class AnswerChainOfThoughts(BaseModel):
    rationale: str = Field(
        ...,
        description="Justification of your answer.",
    )
    answer: str = Field(
        ..., description="Your Answer. Answer with 'N/A' if answer is not found"
    )

我們還添加了更多關于當問題無法回答時,我們期望輸出的細節,使用上下文“如果沒有找到回答,以‘ N/A ’回答”。

通過這種新方法,我們得到了以下基本原理(記住,使用思維鏈):

提供的文本討論的是托馬斯?杰斐遜,而不是杰斐遜?戴維斯。沒有關于杰斐遜?戴維斯去世的信息。

最終回答:

answer=’N/A’

這個給出的結果太好了!但是我們可以使用一種更通用的方法來檢測幻覺嗎?

我們可以,那就是使用代理!

技巧 4:使用代理方法

我們將構建一個簡單的代理,實現分三個步驟的流程:

  • 第一步是包含上下文并向 LLM 提出問題,以便獲得第一個候選回答及其用于回答的相關上下文。
  • 第二步是將問題和第一個候選回答重新表述為聲明性語句。
  • 第三步是要求 LLM 驗證相關上下文是否包含候選回答。這被稱為“自我驗證”:https://arxiv.org/pdf/2212.09561。

為了實現這一點,我們使用LangGraph 定義了三個節點。第一個節點將在包含上下文的同時提出問題,第二個節點將使用 LLM 重新表述問題,第三個節點將檢查語句與輸入上下文的關系。

第一個節點可以如下定義:

def answer_question(self, state: DocumentQAState):
        logger.info(f"Responding to question '{state.question}'")
        assert (
            state.pages_as_base64_jpeg_images or state.pages_as_text
        ), "Input text or images"
        messages = (
            [
                {"mime_type": "image/jpeg", "data": base64_jpeg}
                for base64_jpeg in state.pages_as_base64_jpeg_images
            ]
            + state.pages_as_text
            + [
                f"Answer this question: {state.question}",
            ]
            + [
                f"Use this schema for your answer: {self.answer_cot_schema}",
            ]
        )

        response = self.model.generate_content(
            messages,
            generation_config={
                "response_mime_type": "application/json",
                "response_schema": self.answer_cot_schema,
                "temperature": 0.0,
            },
        )

        answer_cot = AnswerChainOfThoughts(**json.loads(response.text))

        return {"answer_cot": answer_cot}

第二個節點如下定義:

def reformulate_answer(self, state: DocumentQAState):
        logger.info("Reformulating answer")
        if state.answer_cot.answer == "N/A":
            return

        messages = [
            {
                "role": "user",
                "parts": [
                    {
                        "text": "Reformulate this question and its answer as a single assertion."
                    },
                    {"text": f"Question: {state.question}"},
                    {"text": f"Answer: {state.answer_cot.answer}"},
                ]
                + [
                    {
                        "text": f"Use this schema for your answer: {self.declarative_answer_schema}"
                    }
                ],
            }
        ]

        response = self.model.generate_content(
            messages,
            generation_config={
                "response_mime_type": "application/json",
                "response_schema": self.declarative_answer_schema,
                "temperature": 0.0,
            },
        )

        answer_reformulation = AnswerReformulation(**json.loads(response.text))

        return {"answer_reformulation": answer_reformulation}

第三個節點如下定義:

 def verify_answer(self, state: DocumentQAState):
        logger.info(f"Verifying answer '{state.answer_cot.answer}'")
        if state.answer_cot.answer == "N/A":
            return
        messages = [
            {
                "role": "user",
                "parts": [
                    {
                        "text": "Analyse the following context and the assertion and decide whether the context "
                        "entails the assertion or not."
                    },
                    {"text": f"Context: {state.answer_cot.relevant_context}"},
                    {
                        "text": f"Assertion: {state.answer_reformulation.declarative_answer}"
                    },
                    {
                        "text": f"Use this schema for your answer: {self.verification_cot_schema}. Be Factual."
                    },
                ],
            }
        ]
    
        response = self.model.generate_content(
            messages,
            generation_config={
                "response_mime_type": "application/json",
                "response_schema": self.verification_cot_schema,
                "temperature": 0.0,
            },
        )
    
        verification_cot = VerificationChainOfThoughts(**json.loads(response.text))
    
        return {"verification_cot": verification_cot}

完整代碼位于 https://github.com/CVxTz/document_ai_agents。

請注意每個節點如何使用各自的模式用于結構化輸出和自己的提示。這得益于 Gemini 的 API 和 LangGraph具有的靈活性。

不妨使用與上面相同的示例來處理此代碼。

(注意:我們沒有針對第一個提示使用思路鏈,因此驗證因我們的測試而觸發。)

上下文

托馬斯?杰斐遜(1743 年 4 月 13日— 1826 年 7 月 4 日)是美國政治家、種植園主、外交官、律師、建筑師、哲學家和開國元勛,曾于 1801 年至 1809 年擔任美國第三任總統。他是《獨立宣言》的主要起草者。在美國獨立戰爭之后,在 1801 年成為總統之前,杰斐遜是華盛頓領導班子的美國第一任國務卿,然后在亞當斯領導班子擔任美國第二副總統。杰斐遜是支持民主、共和主義和自然權利的主要倡導者,他在州、國家和國際層面制定了形成性文件和決定。(來源:維基百科)

問題

戴維斯?杰斐遜死于哪一年?

第一個節點結果(第一個回答):

relevant_context=“托馬斯?杰斐遜(1743 年 4 月 13 日— 1826 年 7 月 4 日)是美國政治家、種植園主、外交官、律師、建筑師、哲學家和開國元勛,曾于 1801 年至 1809 年擔任美國第三任總統。”

answer=’1826’

第二個節點結果(回答重新表述):

declarative_answer=“戴維斯?杰斐遜于 1826 年去世”

第三個節點結果(驗證):

rationale=“上下文指出托馬斯?杰斐遜于 1826 年去世。斷言指出戴維斯?杰斐遜于 1826 年去世。上下文沒有提到戴維斯?杰斐遜,只提到托馬斯?杰斐遜。”

entailment=’No’

因此驗證步驟拒絕(兩者之間沒有entailment)了初始回答。現在,我們可以避免向用戶返回幻覺。

技巧 5:使用更強大的模型

由于預算或延遲方面的限制,該技巧并不總是容易運用,但你應該知道,更強大的 LLM 更不容易產生幻覺。因此如果可能的話,不妨為最敏感的用例選擇功能更強大的 LLM。你可以在此處查看幻覺基準:https://github.com/vectara/hallucination-leaderboard。我們可以看到,該基準中的頂級模型(最少的幻覺)也位居傳統 NLP 排行榜的榜首。

減少LLM幻覺的五大技巧和方法-AI.x社區

來源:https://github.com/vectara/hallucination-leaderboard

源許可證:Apache 2.0

結語

我們在本教程中探索了通過降低幻覺率來提高 LLM 輸出可靠性的幾種策略。主要建議包括使用思維鏈和提示以指導 LLM 調用,并使用基于工作流程的方法,其中代理旨在驗證自己的回答。

這涉及多個步驟:

  • 檢索 LLM 用來生成回答的確切的上下文信息。
  • 以聲明形式重新表述回答以便于驗證。
  • 指示 LLM 檢查上下文和重新表述的回答之間的一致性。

雖然所有這些技巧都可以顯著提高準確性,但你應該知道沒有那種方法是萬無一失的。如果 LLM 在驗證過程中過于保守或遺漏了真實的幻覺情況,始終存在拒絕有效回答的風險。因此,嚴格評估你的特定 LLM 工作流程仍然至關重要。

全部代碼詳見??https://github.com/CVxTz/document_ai_agents。??

原文標題:??An Agentic Approach to Reducing LLM Hallucinations??,作者:Youness Mansar


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2024-12-31 13:56:41修改
收藏
回復
舉報
回復
相關推薦
主站蜘蛛池模板: 毛片站 | 国产免费一区二区 | 久久99国产精品久久99果冻传媒 | 天天操天天干天天曰 | 成人在线播放 | 91在线观看免费 | 青青草免费在线视频 | 午夜小视频在线播放 | 热99在线 | 国产精品久久久久久久久免费高清 | 亚洲成人一区 | 一区二区三区欧美 | 国产乱xxav| 亚洲二区视频 | 欧美日韩亚洲系列 | 日韩视频在线一区 | 成人福利电影 | 我爱操 | 国产视频一视频二 | a级免费观看视频 | 久久久久久久国产 | 在线成人精品视频 | 久草免费在线视频 | 久久午夜精品福利一区二区 | 久久69精品久久久久久国产越南 | 午夜视频在线 | 99精品欧美一区二区三区 | 日本精品一区二区三区在线观看 | 欧美综合久久 | 中文字幕在线三区 | 亚洲精品一区在线观看 | 成人片免费看 | 国产在线精品一区二区 | 夜夜爽99久久国产综合精品女不卡 | 国产一区二区三区四区三区四 | 免费人成激情视频在线观看冫 | 亚洲国产一区二区三区在线观看 | 亚洲最大av网站 | 精品91久久久 | 色播久久久 | 久久久国产精品 |