随着大语言模型(LLM)的广泛应用,如何评估和改进这些应用的性能成为了一个关键问题。UpTrain作为一个开源平台,提供了一系列评估功能,使得开发者能够对LLM应用进行全面的检测,并提供问题解决的指导。在这篇文章中,我们将介绍如何使用UpTrain的回调处理器在开发链中进行多样化评估,并详细展示如何实现这些功能。
技术背景介绍
UpTrain提供了超过20个预配置检查项(涵盖语言、代码、嵌入等用例),通过根因分析识别失败实例,并提供改进建议。它与Langchain中的检索器进行无缝集成,自动化评估链的性能,并在输出中展示结果。Langchain中的几个选定检索器被用于展示应用场景,包括Vanilla RAG、Multi Query Generation以及Context Compression and Reranking。
核心原理解析
-
Vanilla RAG
- Context Relevance: 检查从查询提取的上下文是否与响应相关。
- Factual Accuracy: 评估LLM是否存在幻觉或提供错误信息。
- Response Completeness: 检查响应是否包含查询请求的所有信息。
-
Multi Query Generation
- Multi Query Accuracy: 确保生成的多查询与原始查询有相同的意义。
-
Context Compression and Reranking
- Context Reranking: 检查重新排序后的节点是否比原始顺序更符合查询。
- Context Conciseness: 检查减少后的节点数量是否仍提供所有必要信息。
代码实现演示
安装依赖库
%pip install -qU langchain langchain_openai langchain-community uptrain faiss-cpu flashrank
引入库
from getpass import getpass
from langchain.chains import RetrievalQA
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_community.callbacks.uptrain_callback import UpTrainCallbackHandler
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers.string import StrOutputParser
from langchain_core.prompts.chat import ChatPromptTemplate
from langchain_core.runnables.passthrough import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
加载和分割文档
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
chunks = text_splitter.split_documents(documents)
创建检索器
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(chunks, embeddings)
retriever = db.as_retriever()
定义LLM
llm = ChatOpenAI(temperature=0, model="gpt-4")
设置UpTrain回调处理器
选择合适的API Key类型并设置API Key:
KEY_TYPE = "openai" # 或 "uptrain"
API_KEY = getpass()
执行Vanilla RAG评估
template = """
Answer the question based only on the following context, which can include text and tables:
{context}
Question: {question}
"""
rag_prompt_text = ChatPromptTemplate.from_template(template)
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| rag_prompt_text
| llm
| StrOutputParser()
)
uptrain_callback = UpTrainCallbackHandler(key_type=KEY_TYPE, api_key=API_KEY)
config = {"callbacks": [uptrain_callback]}
query = "What did the president say about Ketanji Brown Jackson"
docs = chain.invoke(query, config=config)
执行多查询生成评估
multi_query_retriever = MultiQueryRetriever.from_llm(retriever=retriever, llm=llm)
chain = (
{"context": multi_query_retriever, "question": RunnablePassthrough()}
| rag_prompt_text
| llm
| StrOutputParser()
)
question = "What did the president say about Ketanji Brown Jackson"
docs = chain.invoke(question, config=config)
执行上下文压缩及重新排名评估
compressor = FlashrankRerank()
compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)
chain = RetrievalQA.from_chain_type(llm=llm, retriever=compression_retriever)
result = chain.invoke(query, config=config)
应用场景分析
通过集成UpTrain,可以轻松评估LLM应用的性能并在生产环境中进行实时监控。这对于需要高可靠性和准确性的应用尤其重要,比如法律、医疗、金融等领域。
实践建议
- 持续监控:使用UpTrain的实时监控功能,及时识别和解决问题。
- 改进策略:基于评估结果,制定明确的改进策略,以优化LLM应用效果。
- 灵活集成:根据项目需求选择开源或托管服务,确保数据安全和性能稳定。
如果遇到问题欢迎在评论区交流。
—END—