LangChain+RAG+Qwen搭建智能客服

204 阅读1分钟

1. 初始化LLM大模型

llm = ChatTongyi(
    model_name="qwen2-72b-instruct",
    streaming=True,
    api_key=os.environ["DASHSCOPE_API_KEY"]
)

2. 初始化DashScopeEmbeddings

embeddings = DashScopeEmbeddings(
      model="text-embedding-v1",
  )

3. 初始化Chroma

vector = Chroma(collection_name='customer', embedding_function=embeddings,
                  persist_directory='./chroma')

4. 文档切分

这里读取自己的客服相关的文档,持久化到向量数据库中

loader = DirectoryLoader('../text', glob='**/jianli1.txt')
  documents = loader.load()
  text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
  split_docs = text_splitter.split_documents(documents)

5. 持久化向量数据

embeddings = DashScopeEmbeddings(
      model="text-embedding-v1",
  )
  vector = Chroma(collection_name='customer', embedding_function=embeddings,
                  persist_directory='../chroma')
  vector.add_documents(documents=split_docs, embeddings=embeddings)

6. 初始化Langchain Tools

初始化retriever_tool,用来根据用户输入到向量数据库中检索

retriever = vector.as_retriever(search_type="mmr",
                                  search_kwargs={'k': 6, 'lambda_mult': 0.25})
  vector_retriever_tool = create_retriever_tool(
      retriever,
      "vector_retriever_tool",
      "当用户提问时,优先借助该工具检索相关的内容"
  )

  tools = [call_user_save, vector_retriever_tool]

7. 构建prompt

prompt = ChatPromptTemplate.from_messages(
    [      ("system",       "你是一个智能客服,根据用户提出的问题进行回答,如果用户的回答涉及到手机号和地址"       "你需要调用call_user_save函数来生成表单,需要向该函数提供用户的手机号,地址这两项参数,"       "只有这两项参数都提供了才调用该方法,如果用户没有输入手机号和地址请不要调用该函数,如果用户的回答不涉及这两项参数,"       "请不要调用该方法,请返回实际的回复"),      ("placeholder", "{chat_history}"),      ("human", "{input}"),      ("placeholder", "{agent_scratchpad}"),    ]
)

8. 执行AgentExecutor

  agent = create_tool_calling_agent(llm, tools, prompt)

  agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools,
                                                      verbose=True)
  result = agent_executor.invoke({"input": message})
  print(f"result: {result}")
  return result

@tool
def call_user_save(phone: int, address: str) -> str:
  """收集用户的手机号和地址 以便后续联系用户"""
  print(phone, address)
  return "保存成功"

完成代码请参考:gitee.com/yaomd/custo…