引言
在进行查询分析时,我们经常需要根据分类列创建过滤器。然而,当分类值过多时,准确地匹配这些值就成了一个挑战。特别是在使用大语言模型(LLM)时,高基数的分类变量可能导致上下文溢出或无法精确匹配。在这篇文章中,我们将探讨如何有效处理这一问题。
主要内容
高基数分类变量的挑战
- 上下文限制:LLM有其上下文限制,太多的可能值会导致溢出。
- 精确匹配:分类值的拼写不同或不准确会导致匹配失败。
解决策略
1. 添加所有值到提示中
在提示中添加所有可能的分类值,可以引导LLM生成更准确的查询。然而,当值过多时,这可能会导致上下文长度超限错误。
2. 使用向量搜索
创建分类值的嵌入索引,然后根据查询找到最相关的值。这种方法可以保持查询的上下文简洁,并通过相似度检索来提高准确性。
3. 验证后替换
让LLM生成值后,使用Pydantic类或类似工具进行验证和替换,以确保输出是有效的分类值。
代码示例
以下是使用向量搜索和Pydantic类进行验证的方法代码示例。
import os
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_core.pydantic_v1 import BaseModel, validator
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
# 设置API密钥
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
# 创建嵌入索引
names = ["Hayley Gonzalez", "Jesse Knight", ...] # 你的数据
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(names, embeddings, collection_name="author_names")
class Search(BaseModel):
query: str
author: str
@validator("author")
def validate_author(cls, v: str) -> str:
return vectorstore.similarity_search(v, k=1)[0].page_content
system = """Generate a relevant search query for a library system"""
prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "{question}"),
]
)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
structured_llm = llm.with_structured_output(Search)
corrective_query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm
result = corrective_query_analyzer.invoke("what are books about aliens by jes knight")
print(result) # 输出应是正确的作者名称,如 'Jesse Knight'
常见问题和解决方案
- 上下文长度超限:可以通过分批处理或使用更长上下文的LLM来解决。
- 拼写错误:使用向量搜索纠正拼写错误。
总结和进一步学习资源
处理高基数分类变量时,结合提示设计、向量搜索以及后处理验证是有效的策略。以下资源可帮助你进一步学习:
参考资料
- Langchain API Documentation
- OpenAI Embeddings Guide
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—