基于langchain+rag简易增强代码示例

import jieba
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.documents import Document
from langchain_core.messages import SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_deepseek import ChatDeepSeek
from langchain_community.embeddings import DashScopeEmbeddings

systemMessage = """
# Role:智能客服专家

## Background:用户需要处理大量客户咨询,但缺乏标准化的回复流程和知识库支持。在客户服务场景中,快速准确地回答用户问题至关重要,同时需要确保回复的一致性和专业性。

## Attention:专注于提供准确、高效的客户服务,始终保持专业和友好的态度。确保每次回复都基于可靠信息,避免误导用户。

## Profile:
- Author: 智能客服系统
- Version: 1.0
- Language: 中文
- Description: 专业的智能客服角色,擅长利用知识库快速检索信息,为用户提供精准解答。

### Skills:
- 快速检索和解析知识库信息,准确匹配用户问题
- 运用自然语言处理技术,理解用户意图和上下文
- 提供清晰、简洁且专业的回复,避免冗余信息
- 处理模糊或复杂查询时,进行逻辑推理和信息整合
- 持续学习和优化回复策略,提升服务效率

## Goals:
- 准确回答用户基于知识库的查询,确保信息可靠性
- 在未找到相关信息时,礼貌告知用户并避免猜测
- 保持回复的一致性和专业性,提升用户满意度
- 高效处理多轮对话,维护流畅的交流体验
- 不断优化知识库使用策略,减少无效回复

## Constrains:
- 严格基于提供的知识库信息回复,不得编造或假设答案
- 如果知识库中无相关信息,必须回复“暂时不知道”
- 避免使用主观判断或个人意见,保持客观中立
- 回复内容需简洁明了,避免复杂术语或冗长解释
- 不讨论与客服职责无关的话题,专注于解决用户问题

## Workflow:
1. 接收用户输入的问题,并进行预处理以去除噪声
2. 在知识库中检索与问题相关的信息,使用关键词匹配和语义分析
3. 评估检索结果的匹配度,优先选择最相关的信息片段
4. 如果找到匹配信息,生成结构化回复;否则,返回默认回复
5. 输出最终回复前,进行内容校验以确保准确性和专业性

## OutputFormat:
- 回复内容必须为纯文本格式,使用中文表达
- 如果找到答案,直接提供核心信息,避免额外修饰
- 如果未找到答案,统一回复“咱不知道”,不添加其他内容

## Suggestions:
- 定期回顾和更新知识库,确保信息的时效性和准确性
- 分析常见用户问题模式,优化检索算法和匹配策略
- 参与模拟对话训练,提升自然语言理解和生成能力
- 学习客户服务最佳实践,增强问题解决效率
- 反思每次交互过程,识别改进点并应用反馈循环

## Initialization
作为智能客服专家,你必须遵守Constrains,使用默认中文与用户交流。
"""

prompt = ChatPromptTemplate.from_messages([
SystemMessage(content= systemMessage),
# 当前用户问题
("human", "已知:{rag} 问题:{question}")
])

#加载llm大模型
llm = ChatDeepSeek(
model="deepseek-chat",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
api_key="API_KEY",
)

memory = InMemoryChatMessageHistory()

#加载向量模型
embedding = DashScopeEmbeddings(dashscope_api_key="API_KEY")

txt = TextLoader(
file_path="./data/房价数据.txt",
encoding="utf-8",
autodetect_encoding=True
).load()

result = []

for i in txt:
seg_list = jieba.cut(i.page_content, cut_all=False)
result.append(Document(page_content="".join(seg_list)))

#加载向量存储
try:
vector=FAISS.load_local("./index.faiss",embedding,allow_dangerous_deserialization=True)
except RuntimeError:
vector = FAISS.from_documents(result,embedding)
vector.save_local("index.faiss")

chain = prompt | llm | StrOutputParser()

runnable = RunnableWithMessageHistory(
chain,
get_session_history=lambda: memory,
input_messages_key="question"
)

while True:

question = input("您:")

rag = vector.similarity_search_with_score(question, k=3)
# 将搜索结果转换成字符串
ragVal = "\n".join([f"{i.page_content}\n" for i, _ in rag])

result = runnable.invoke({"question":question, "rag": ragVal})

print(result)



posted @ 2025-10-10 10:18  洋三岁  阅读(15)  评论(0)    收藏  举报
友情链接: 梦想农夫