如何使用LangChain和LangGraph大幅提升RAG效果

▼最近直播超级多,预约保你有收获

846d5930add5d8a001007bdeea3b8889.png

 1

LangChain 的2大核心概念

1、面向过程架构设计的 Chains(链):基于大模型编写的程序,遵循预定义的步骤和规则,并且不可灵活调整,用于执行任务,比如:自动 SQL 编写或多轮对话等。

2、面向目标架构设计的 Agents(智能体):基于大模型的推理能力,对任务做出规划,然后使用第三方工具(比如:搜索工具、代码解释器、业务 API 等)完成规划子任务的执行,Agents 整个过程更灵活,根据用户 Prompt 请求动态规划、动态行动、动态反馈。

d8663f95e45befd428d7498de3efa2eb.png

目前由于大模型的推理能力还存在一定的幻觉,为了处理现实世界的问题时,能够更鲁棒,一个常见的落地方案是希望找到介于 Chains 和 Agents 之间的解决方案。即不像 Chains 那样硬编码,但也不像 Agents 那样完全由大模型驱动。

LangGraph 正是解决这类问题而生!

2

LangGraph 架构设计

LangGraph 以 LangChain 为核心,用于创建工作流程中循环图的开发框架。

99d98a5902b73a9bd66c2301093f1a3a.png

我们来看如下的需求:

你希望在知识库上搭建一个基于 RAG 的检索增强系统。现在,你希望引入这样一种情况:如果 RAG 检索输出未满足特定质量要求,智能体/链应该再次检索数据,并且 Rewrite Prompt 提示词。重复此过程,直到检索数据达到质量阈值为止。

使用 LangGraph 可以实现这种循环逻辑。当然使用 LangGraph 可以做更多事情。

总之,可以将 LangGraph 视为向链中引入循环逻辑,使其成为循环链。

LangGraph 对于构建 AutoGen 或 MetaGPT 等多代理应用程序至关重要。

 3

使用 LangGraph 改善 RAG 

在接下来的示例中,我们希望将 RAG 检索系统在向量数据库中的最终输出减少到不超过30个字符。如果输出长度大于30个字符,则希望引入循环,使用不同的提示词再次尝试,直到长度小于30个字符为止。当然这仅仅是一个演示目的的基本逻辑。你可以基于具体的业务场景实现更复杂的业务逻辑来改善 RAG的检索结果。

基于 LangGraph 的架构设计图如下所示:

2463cf6ac407e522598bf4f5215ea9ec.png

基于以上架构图,详细代码落地如下:

3.1、初始化大模型。这里使用 OpenAI API,也可以使用其他大模型。

from typing import Dict, TypedDict, Optional
from langgraph.graph import StateGraph, END
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.embeddings.openai import OpenAIEmbeddings

llm = OpenAI(openai_api_key='your API')

3.2、定义一个 StateGraph,为 LangGraph 的图对象。

class GraphState(TypedDict):
    question: Optional[str] = None
    classification: Optional[str] = None
    response: Optional[str] = None
    length: Optional[int] = None
    greeting: Optional[str] = None

workflow = StateGraph(GraphState)

3.3、从现有向量数据库中初始化一个 RAG 检索链。

def retriever_qa_creation():
        embeddings = OpenAIEmbeddings()
        db = Chroma(embedding_function=embeddings,persist_directory='/database',collection_name='details')
        qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
        return qa

rag_chain = retriever_qa_creation()

3.4、我们将向该 StatGraph 图中添加节点。

def classify(question):
    return llm("classify intent of given input as greeting or not_greeting. Output just the class.Input:{}".format(question)).strip()

def classify_input_node(state):
    question = state.get('question', '').strip()
    classification = classify(question) 
    return {"classification": classification}

def handle_greeting_node(state):
    return {"greeting": "Hello! How can I help you today?"}

def handle_RAG(state):
    question = state.get('question', '').strip()
    prompt = question
    if state.get("length")<30:
         search_result = rag_chain.run(prompt)
    else:
         search_result = rag_chain.run(prompt+'. Return total count only.')

    return {"response": search_result,"length":len(search_result)}


def bye(state):
    return{"greeting":"The graph has finished"}

workflow.add_node("classify_input", classify_input_node)
workflow.add_node("handle_greeting", handle_greeting_node)
workflow.add_node("handle_RAG", handle_RAG)
workflow.add_node("bye", bye)
  • 使用 state.get() 来读取任何状态变量。

  • handle_RAG 节点帮助实现我们希望的循环自定义逻辑。如果输出的长度< 30,则使用提示符 A;否则使用提示符 B。对于第一种情况(当 RAG 节点尚未执行时),我们将传递 length=0,并提供一个提示词。

3.5、我们将添加入口点和边。

workflow.set_entry_point("classify_input")
workflow.add_edge('handle_greeting', END)
workflow.add_edge('bye', END)

3.6、 我们添加条件边。

def decide_next_node(state):
    return "handle_greeting" if state.get('classification') == "greeting" else "handle_RAG"

def check_RAG_length(state):
    return "handle_RAG" if state.get("length")>30 else "bye"

workflow.add_conditional_edges(
    "classify_input",
    decide_next_node,
    {
        "handle_greeting": "handle_greeting",
        "handle_RAG": "handle_RAG"
    }
)

workflow.add_conditional_edges(
    "handle_RAG",
    check_RAG_length,
    {
        "bye": "bye",
        "handle_RAG": "handle_RAG"
    }
)

3.7、编译并调用提示词。初始时保持 length 变量设置为0。

app = workflow.compile()
app.invoke({'question':'Mehul developed which projects?','length':0})
# 输出
{'question': 'Mehul developed which projects?',
 'classification': 'not_greeting',
 'response': ' 4',
 'length': 2,
 'greeting': 'The graph has finished'}

对于上述提示多次,LangGraph 图流程如下所示:

classify_input: 情感将为not_greeting。

由于第一个条件边界,移至handle_RAG。

由于 length=0,使用第一个提示并检索答案(总长度将大于30)。

由于第二个条件边界,再次移至 handle_RAG。

由于 length>30,使用第二个提示符。

由于第二个条件边界,移至 bye。

结束。

为了帮助同学们彻底掌握 LangChain 和 LangGraph 的架构设计应用,今晚20点我会开一场直播和同学们深度剖析,请同学们点击以下预约按钮免费预约

 4

AI大模型架构设计直播课程

大模型的技术体系非常复杂,快速掌握并不容易,我们打造了大模型应用技术的系列直播课程,包括:通用大模型技术架构原理、大模型 Agent 应用开发、企业私有大模型开发、向量数据库、大模型应用治理、大模型应用行业落地案例等6项核心技能,帮助同学们快速掌握 AI 大模型的技能。

 🔥即将开播 

立即扫码,即可免费预约

进入直播,大佬直播在线答疑!

164f2804c26e8e33613ea213a165043d.gif

7bd152b625346fbebd57f38e417cf4fd.png

本期名额有限

高度起始于速度(手慢无!!)

 5

领取一份《AI 大模型技术知识图谱

最近很多同学在后台留言:“玄姐,AI 大模型技术的知识图谱有没?”、“AI 大模型技术有学习路线吗?”

我们倾心整理了 AI 大模型技术的知识图谱快来领取吧!

de57724a66d20ad3dbae41cd290a5056.png

这份业界首创知识图谱和学习路线,今天免费送给大家一份!

只需要以下3步操作就可免费领取:

第一步长按扫码以下我的视频号:玄姐谈AGI

5348991b3eceb43560309c99b2b4d80a.png

第二步:扫码后,点击以下关注按钮,就可关注我。

beaa1a88d1a4aede705f90804392657e.jpeg

第三步:点击"客服“按钮,回复知识图谱即可领取。

170b819449d885371c450865333c506d.jpeg

参考:https://mp.weixin.qq.com/s/Qxnny8ZHA_yG_XLQJm_QKg

END

  • 19
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值