动态链构建指南:让链式调用更智能

80 阅读3分钟

动态链构建指南:让链式调用更智能

引言

在编程和人工智能领域,动态链的构建常被用于根据输入在运行时生成链的一部分。这种动态调整机制尤为适合如路由这样的应用场景。在这篇文章中,我们将探讨如何借助LangChain中的RunnableLambda实现自构造链,以及在不同的API之间动态切换。

主要内容

1. 动态链构建的基础

LangChain允许通过RunnableLambda返回一个Runnable,而这个Runnable在执行整个链时会被调用。这一特性使得动态链构建成为可能。

2. API的多样性与选择

在构建动态链时,你可以根据需求选择不同的API,例如OpenAI、Anthropic、Azure、Google等。为了提高访问的稳定性,尤其是在某些地区,你可能需要使用API代理服务。

3. 实现动态链的步骤

  • 定义上下文问题:我们将用户的问题转化为独立的问题,通过历史记录动态调整。
  • 伪检索器:模拟数据检索的过程,为问题提供上下文支持。
  • 完整链的构建:结合上下文化问题与伪检索器,通过LangChain构建一个完整的回答链。

代码示例

以下是一个完整的动态链构建示例,其中使用多个API进行调用。

import os
from getpass import getpass
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable, RunnablePassthrough, chain

# 设置API代理服务提高访问稳定性
os.environ["OPENAI_API_KEY"] = getpass()
os.environ["ANTHROPIC_API_KEY"] = getpass()

llm_openai = ChatOpenAI(model="gpt-4o-mini")
llm_anthropic = ChatAnthropic(model="claude-3-5-sonnet-20240620")

contextualize_instructions = """将最新用户问题转换为独立问题,给定聊天记录。不要回答问题,只返回问题。"""
contextualize_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", contextualize_instructions),
        ("placeholder", "{chat_history}"),
        ("human", "{question}"),
    ]
)
contextualize_question = contextualize_prompt | llm_openai | StrOutputParser()

qa_instructions = (
    """根据以下上下文回答用户问题:\n\n{context}."""
)
qa_prompt = ChatPromptTemplate.from_messages(
    [("system", qa_instructions), ("human", "{question}")]
)

@chain
def contextualize_if_needed(input_: dict) -> Runnable:
    if input_.get("chat_history"):
        return contextualize_question
    else:
        return RunnablePassthrough() | itemgetter("question")

@chain
def fake_retriever(input_: dict) -> str:
    return "Egypt's population in 2024 is about 111 million"

full_chain = (
    RunnablePassthrough.assign(question=contextualize_if_needed).assign(
        context=fake_retriever
    )
    | qa_prompt
    | llm_anthropic
    | StrOutputParser()
)

result = full_chain.invoke(
    {
        "question": "what about egypt",
        "chat_history": [
            ("human", "what's the population of indonesia"),
            ("ai", "about 276 million"),
        ],
    }
)
print(result)

常见问题和解决方案

  • API访问受限:可使用代理服务来改善连接稳定性。
  • 动态链的复杂性:理解每个组件的职责有助于调试和扩展。

总结和进一步学习资源

动态链构建是一项强大的技术,可以根据实际需求动态调整其行为。了解LangChain的特性和灵活性将为开发者提供更强的工具。你可以进一步学习LangChain的官方文档和相关API的使用指南。

参考资料

  1. LangChain 文档
  2. OpenAI API 文档
  3. LangChain 示例代码

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

---END---