news 2026/4/18 8:51:39

用langchain写个示例代码调用它的特色功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用langchain写个示例代码调用它的特色功能

当然可以!下面是一个完整的 Python 实例,使用 LangChain(v0.2+ / v1.x 兼容)演示其六大核心特色功能:

  • ✅ 模块化组件(Prompt + LLM + OutputParser)
  • ✅ 外部数据集成(RAG:加载本地文档 + 向量检索)
  • ✅ 记忆(Memory:多轮对话上下文)
  • ✅ 链(Chain:声明式 LCEL 流水线)
  • ✅ 代理(Agent:调用工具执行动作)
  • ✅ 回调(Callback:打印日志)

💡 假设你已安装必要依赖:

pip install langchain langchain-openai langchain-community faiss-cpu pypdf

🧪 完整代码示例:带记忆、知识库和工具的智能客服

import os from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import FAISS from langchain.chains import create_history_aware_retriever, create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.messages import HumanMessage, AIMessage from langchain.memory import ConversationBufferMemory from langchain.agents import Tool, initialize_agent, AgentType from langchain.callbacks import StdOutCallbackHandler # === 1. 设置大模型(Model I/O)=== llm = ChatOpenAI( model="gpt-4o-mini", temperature=0.3, api_key=os.getenv("OPENAI_API_KEY") # 请设置环境变量 ) # === 2. 加载外部知识(RAG 数据连接)=== # 假设当前目录有 `faq.pdf`(可替换为任意 PDF/文本) loader = PyPDFLoader("faq.pdf") docs = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) splits = text_splitter.split_documents(docs) vectorstore = FAISS.from_documents(splits, OpenAIEmbeddings()) retriever = vectorstore.as_retriever() # === 3. 构建带记忆的检索问答链(Chain + Memory)=== prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个客服助手。请基于以下上下文回答问题:\n{context}"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}") ]) document_chain = create_stuff_documents_chain(llm, prompt) retriever_chain = create_history_aware_retriever(llm, retriever, ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}"), ("human", "根据对话历史,生成一个搜索查询以查找相关信息。") ]) ) qa_chain = create_retrieval_chain(retriever_chain, document_chain) # === 4. 定义工具(Tools for Agent)=== def send_email(to: str, content: str) -> str: # 模拟发邮件(实际可调用 SMTP 或 API) return f"✅ 邮件已发送至 {to},内容:{content[:30]}..." email_tool = Tool( name="send_email", func=send_email, description="当用户要求发送邮件时使用,参数:to(邮箱地址),content(邮件内容)" ) # === 5. 初始化带工具的 Agent(Agents)=== agent = initialize_agent( tools=[email_tool], llm=llm, agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, verbose=True, memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True), handle_parsing_errors=True ) # === 6. 回调处理器(Callbacks)=== handler = StdOutCallbackHandler() # === 7. 模拟用户交互 === chat_history = [] def ask_question(user_input: str): global chat_history # 先尝试用 RAG 知识库回答 try: response = qa_chain.invoke({ "input": user_input, "chat_history": chat_history }) answer = response["answer"] chat_history.extend([HumanMessage(content=user_input), AIMessage(content=answer)]) print(f"🤖 (知识库): {answer}\n") except Exception as e: answer = None # 如果知识库无法回答,交给 Agent 决策是否调用工具 if not answer or "不知道" in answer or "无法回答" in answer: print("🔄 转交 Agent 处理...") agent_response = agent.run(user_input, callbacks=[handler]) chat_history.append(HumanMessage(content=user_input)) chat_history.append(AIMessage(content=agent_response)) print(f"🤖 (Agent): {agent_response}\n") # === 8. 测试对话 === if __name__ == "__main__": # 示例:先问知识库问题,再要求发邮件 ask_question("你们的退货政策是什么?") # 从 faq.pdf 中检索 ask_question("请把刚才的回答发到 user@example.com") # 触发 send_email 工具

🔍 功能亮点说明:

表格

特性代码体现
模块化ChatPromptTemplate+StrOutputParser+FAISS各司其职
RAGPyPDFLoader+FAISS构建私有知识库
记忆chat_history传递上下文,支持多轮问答
链(LCEL)create_retrieval_chain是典型 Chain 编排
Agent + Toolsinitialize_agent+ 自定义send_email工具
回调StdOutCallbackHandler()打印执行过程

📝 使用前准备:

  1. 设置 OpenAI API Key:export OPENAI_API_KEY='your-key'
  2. 准备一个faq.pdf文件(或修改代码加载其他文档)
  3. 首次运行会下载 embedding 模型(约 500MB)

这个例子展示了 LangChain 如何将知识检索、对话记忆、工具调用无缝融合,构建一个接近生产级的智能应用。你可以在此基础上扩展数据库查询、Web 搜索、多模态等能力。需要更简化的版本或特定场景(如纯代码生成、Excel 分析),也可以告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:02:11

基于Zigbee的办公室灯光智能控制系统设计

基于Zigbee的办公室灯光智能控制系统设计 一、设计背景与意义 在现代办公场景中,传统灯光控制系统多采用手动开关或定时控制,存在能源浪费严重、控制灵活性不足、无法适配人员流动变化等问题。随着节能减排政策推进与智能家居技术发展,办公室…

作者头像 李华
网站建设 2026/4/17 0:09:05

《TAML》好文推荐 | 来自清华大学张宇飞团队最新研究成果 基于文本生成翼型:FoilCLIP,一种语言驱动的气动设计新框架

以下内容转载自“TAML力学快报英文”,仅作分享 原文链接: 《TAML》好文推荐 | 来自清华大学张宇飞团队最新研究成果 基于文本生成翼型:FoilCLIP,一种语言驱动的气动设计新框架 传统翼型设计依赖于CFD和风洞试验的迭代过程,需要大…

作者头像 李华
网站建设 2026/4/18 8:35:29

从SEO到GEO,理解AI搜索时代的底层逻辑革命

本文旨在深度解析GEO的本质、其与SEO的根本区别,以及企业必须拥抱GEO的核心动因。理解这场搜索范式的革命,是制定一切有效策略的起点。一、重新定义搜索:当答案取代链接列表传统的搜索引擎优化(SEO)致力于让网站在关键…

作者头像 李华
网站建设 2026/4/18 3:02:15

三相异步电机矢量控制(FOC)和直接转矩控制(DTC)的对比(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

课题:三相异步电机矢量控制(FOC)和直接转矩控制(DTC)的对比(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码研究,具体内容请看 资料包含: 1三相异步电机直接转矩控制Simulink模型2三相异步电机转速电流环Simulink模…

作者头像 李华
网站建设 2026/4/3 5:29:03

探索基于Tent映射的混合灰狼优化改进算法

一种基于Tent映射的混合灰狼优化的改进算法_滕志军 MATLAB代码,可提供代码与论文。 首先,其通过 Tent 混沌映射产生初始种群,增加种群个体的多样性; 其次,采用非线性控制参数,从而提高整体收敛速度; 最后,…

作者头像 李华