更新于 2025年9月25日
8 分钟
# pip install langchain langchain-openaifrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplate# 1) 模型llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 2) 提示词prompt = ChatPromptTemplate.from_messages(和流式传输指南。---## 你80%的时间会用到的构建块### 1) 提示词和输出解析- 使用`ChatPromptTemplate`来构建结构化提示词。- 使用`StrOutputParser`或JSON解析器来解析输出,以获得类型化的响应。```pythonfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4o-mini")prompt = ChatPromptTemplate.from_template("""用3个要点总结以下文本:---{text}""")parser = StrOutputParserchain = prompt | llm | parsersummary = chain.invoke({"text": "LangChain helps build LLM apps with RAG and tools."})print(summary)# pip install faiss-cpu tiktokenfrom langchain_openai import OpenAIEmbeddings, ChatOpenAIfrom langchain_community.vectorstores import FAISSfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_core.prompts import ChatPromptTemplate# 准备文档texts = .---## 从原型到生产:一步一步的蓝图### 步骤1:定义用户故事- 用户是谁?他们试图完成什么工作?- 示例:“一个支持代理,回答来自内部文档和最近工单的产品问题。”### 步骤2:选择最小可行技术栈- 模型:选择一个价格合理、可靠的模型(例如,GPT-4o-mini或一个前沿的开源模型)。- 数据:确定你现在是否需要RAG。如果需要,从本地的FAISS开始。- I/O:使用LCEL进行快速迭代;避免自定义粘合代码。### 步骤3:实现一个干净的RAG循环- 正确分割文档。- 索引嵌入。- 使用上下文和引用进行提示。- 添加一个护栏,以避免在找不到相关上下文时产生幻觉。```pythonfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplateqa_prompt = ChatPromptTemplate.from_template("""仅使用以下上下文回答问题。如果答案不在上下文中,请说“我不知道”。包括引用的文档ID。上下文:{context}问题:{question}""")parser = StrOutputParserrag_chain = (RunnableParallel(context=retriever, question=RunnableLambda(lambda x: x.### 步骤5:类型化输出和验证- 使用`PydanticOutputParser`或JSON模式来强制执行API响应的结构。- 验证字段以捕获模型漂移。### 步骤6:用于实际任务的工具和函数调用- 谨慎引入工具。- 常用工具:计算器、网络搜索、SQL查询执行器、代码运行器。- 在文档字符串中清楚地描述工具的功能。### 步骤7:强化- 速率限制和重试策略。- 超时和熔断器。- 安全过滤器和内容检查。### 步骤8:评估与持续改进- 使用黄金数据集进行测试(输入→预期输出)。- 评估忠实度、答案完整性和引用准确性。- 测量检索命中率和延迟。---## 常见模式和注意事项- 从简单开始:先链,后代理。你将获得可预测性和更低的成本。- 分块很重要:调整块大小/重叠可以比模型交换更能改变检索质量。- 提示词泄露:不要将所有东西都塞进系统提示词中;保持它们的重点。- 确定性:为评估和关键工作流程设置`temperature=0`。- 流式传输用户体验:在系统的其余部分获取资产或预加载上下文时,将令牌流式传输到UI。- 结构化输出:使用解析器使下游集成变得轻松。---## 一个完整的迷你项目:带引用的文档问答此示例将所有内容联系在一起:摄取、RAG、答案生成和流式传输。```python# pip install langchain langchain-openai faiss-cpu tiktokenfrom langchain_openai import ChatOpenAI, OpenAIEmbeddingsfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.vectorstores import FAISSfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnableParallel, RunnableLambda# 1) 摄取corpus = {"pricing": "我们的Pro计划支持100万个上下文令牌,并包括优先支持。","limits": "Pro用户的API速率限制为每分钟60个请求。","security": "除非管理员禁用日志记录,否则我们会将日志存储30天。",}splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)all_chunks, ids = [], []for doc_id, text in corpus.items:for i, chunk in enumerate(splitter.split_text(text)):all_chunks.append(chunk)ids.append(f"{doc_id}-{i}")# 2) 索引db = FAISS.from_texts(all_chunks, OpenAIEmbeddings)retriever = db.as_retriever(k=4)# 3) 提示词prompt = ChatPromptTemplate.from_template("""你是一个支持助手。使用上下文来回答问题。如果不确定,请说“我不知道”。包括源ID的引用。上下文:{context}问题:{question}""")# 4) 模型和解析器llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)parser = StrOutputParser# 5) 组合链rag = (RunnableParallel(context=retriever,question=RunnableLambda(lambda x: x["question"]) # 直通)| prompt| llm| parser)# 6) 提问for chunk in rag.stream({"question": "Pro费率限制和日志保留策略是什么?"}):print(chunk, end="", flush=True)batch进行批量处理以提高吞吐量。prompt | llm链,并使用.invoke或.stream进行测试。 官方教程逐步介绍了简单的聊天、RAG和代理,以便快速入门。Runnable链都支持.stream进行同步,.astream进行异步,以便在块到达时产生块。 流式传输指南涵盖了用法和最佳实践。