news 2026/4/3 5:46:57

用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/1 19:50:42

美空军引入智能机器人系统提升军机维修效能

点赞、关注、收藏不迷路 【据美国下一代防务网站1月21日报道】美空军引入美格雷马特机器人公司“智能机器人军机座舱盖打磨系统”,提升军机维修效能。该系统搭载公司自研的人工智能平台,可自主识别丙烯酸与聚碳酸酯材质舱盖老化缺陷,实时适配…

作者头像 李华
网站建设 2026/3/16 3:18:30

如何通过面试判断产品经理PM的实力?

近些年,应聘产品经理职位的求职者络绎不绝。特别是随着互联网的兴起,越多越多的应届生、往届生开始向产品方面发展。那应聘产品经理时,到底应该表现哪些特点和能力呢?面试时,面试官又会关注求职者哪些方面呢&#xff1…

作者头像 李华
网站建设 2026/3/30 21:31:43

【乐山师范学院支持 | SPIE (ISSN: 0277-786X)出版 | 往届已见刊并完成EI、Scopus检索 | EI 检索】第三届遥感技术与测量测绘国际学术会议(RSTSM 2026)

第三届遥感技术与测量测绘国际学术会议(RSTSM 2026) 2026 3rd International Conference on Remote Sensing Technology and Survey Mapping 2026年3月6-8日,武汉 大会官网:www.rstsm.net【投稿参会】 截稿时间:见…

作者头像 李华
网站建设 2026/4/3 4:44:34

计算机毕业设计springboot高校实验室安全巡检系统 基于SpringBoot的高校实验室智能安防与巡查管理平台 SpringBoot框架下的高校实验室安全风险监控与巡检信息系统

计算机毕业设计springboot高校实验室安全巡检系统(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着高等教育的蓬勃发展,高校实验室建设规模日益扩大,设…

作者头像 李华
网站建设 2026/3/31 23:45:26

不用请客送礼,这样做让客户愿意跟你长期合作

在制造业B2B这个领域,有很多销售错误地认为,维系客户关系要依靠吃饭喝酒、送礼品来拉近关系,其实事实上,真正能够让工厂老板和采购愿意与你长期合作的,从来都不是人情关系,而是你能够提供的可依赖的专业价值…

作者头像 李华