千问怎么结合LangChain搭建AI应用?LangChain集成开发实战指南
要把通义千问这样的大模型接入业务系统,光有API权限还不够,关键还在于如何把它“装进”一个可维护、可扩展的应用框架里。LangChain就是干这个的——它提供了一套标准化的封装和编排工具,让开发者能像搭积木一样,把模型能力、记忆机制、知识检索和工具调用组合起来。下面直接拆解五个核心步骤,从环境搭建到流式响应,一步步讲清楚。
一、动工前的准备工作:API密钥和运行环境
LangChain本身不提供模型服务,它只是一个调度层。所以第一步,得先把通义千问的访问凭证配置好,同时安装对应的社区集成模块。这两件事缺一不可,否则不是初始化报错就是401认证失败。
核心依赖安装命令:
pip install langchain langchain-community dashscope
接着去阿里云百炼控制台的「API密钥管理」里创建新密钥,把那个字符串复制下来。生产环境推荐用环境变量配置:
export DASHSCOPE_API_KEY="sk-xxx"
配置完可以用一段简单的Python脚本验证:llm.invoke("测试"),能返回非空字符串就算搞定。
二、选对模型接口:Tongyi vs ChatTongyi
LangChain把通义千问封装成了两类接口。一个是面向单轮文本生成的
Tongyi
ChatTongyi
文本生成模型初始化:
from langchain_community.llms import Tongyi
llm = Tongyi(dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"), model="qwen-max")
聊天模型初始化:
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage, SystemMessage
chat_model = ChatTongyi(model="qwen3-turbo", temperature=0.5)
这里有个容易踩的坑:
Tongyi只接收字符串,ChatTongyi必须传消息对象列表
三、让对话记住上下文:Memory模块
默认情况下,每次调用模型都是独立的,模型没有“记忆”。要实现“用户先问旗舰产品是什么,接着问它有什么优势时能自动理解指代”,就必须引入Memory模块来持久化对话上下文。在多种内存策略里,
ConversationBufferMemory
初始化内存组件:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
然后构造带记忆的链:
from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一家科技公司的AI助手,请用中文专业回答。"),
("human", "{input}")
])
chain = LLMChain(llm=chat_model, prompt=prompt, memory=memory)
执行连续问答时,模型就能准确衔接前后文了:
chain.invoke({"input": "我们的旗舰产品是什么?"})
chain.invoke({"input": "它有什么优势?"})
必须记住的一点:
memory.return_messages必须设为True
四、知识增强:把企业文档接入模型
当用户提问超出预设提示词范围时,需要从企业文档库中检索相关片段作为上下文。LangChain通过Embeddings + VectorStore双模块实现,而通义千问的text-embedding-v3向量模型可以直接替代OpenAIEmbeddings。
初始化向量模型:
from langchain_community.embeddings import DashScopeEmbeddings
embeddings = DashScopeEmbeddings(model="text-embedding-v3")
加载本地PDF并切分文本:
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("product_manual.pdf")
docs = loader.load_and_split()
构建向量索引:
from langchain_community.vectorstores import FAISS
vectorstore = FAISS.from_documents(docs, embeddings)
绑定检索器后形成问答链:
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
这里有个中文分词的兼容问题:
DashScopeEmbeddings初始化时需添加参数chunk_size=500
五、流式响应与链路追踪
面向终端用户的AI应用,流式输出几乎是标配——打字机效果能大幅提升交互体验。同时,完整记录调用链对问题回溯也很关键。LangChain原生支持stream方法,并通过LangSmith自动捕获所有中间步骤。
流式输出(仅限ChatTongyi):
messages = [HumanMessage(content="请解释Transformer架构")]
for chunk in chat_model.stream(messages):
print(chunk.content, end="", flush=True)
开启LangSmith追踪:
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = "lsk-xxx"
os.environ["LANGCHAIN_PROJECT"] = "qwen-production"
最后再提醒一下: