mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-04-29 10:56:22 +02:00
add sales test
This commit is contained in:
parent
9f653ea60b
commit
bd1014e19a
5 changed files with 33 additions and 84 deletions
BIN
examples/faq.xlsx
Normal file
BIN
examples/faq.xlsx
Normal file
Binary file not shown.
|
|
@ -6,28 +6,18 @@
|
|||
"""
|
||||
import asyncio
|
||||
|
||||
from langchain.embeddings import OpenAIEmbeddings
|
||||
|
||||
from metagpt.config import CONFIG
|
||||
from metagpt.const import EXAMPLE_PATH
|
||||
from metagpt.document_store import FaissStore
|
||||
from metagpt.logs import logger
|
||||
from metagpt.roles import Sales
|
||||
|
||||
|
||||
def get_store():
|
||||
embedding = OpenAIEmbeddings(openai_api_key=CONFIG.openai_api_key, openai_api_base=CONFIG.openai_base_url)
|
||||
return FaissStore(EXAMPLE_PATH / "example.json", embedding=embedding)
|
||||
|
||||
|
||||
async def search():
|
||||
role = Sales(profile="Sales", store=get_store())
|
||||
queries = ["Which facial cleanser is good for oily skin?", "Is L'Oreal good to use?"]
|
||||
|
||||
for query in queries:
|
||||
logger.info(f"User: {query}")
|
||||
result = await role.run(query)
|
||||
logger.info(result)
|
||||
store = FaissStore(EXAMPLE_PATH / "example.json")
|
||||
role = Sales(profile="Sales", store=store)
|
||||
query = "Which facial cleanser is good for oily skin?"
|
||||
result = await role.run(query)
|
||||
logger.info(result)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ from langchain.embeddings import OpenAIEmbeddings
|
|||
from langchain.vectorstores import FAISS
|
||||
from langchain_core.embeddings import Embeddings
|
||||
|
||||
from metagpt.config import CONFIG
|
||||
from metagpt.const import DATA_PATH
|
||||
from metagpt.document import IndexableDocument
|
||||
from metagpt.document_store.base_store import LocalStore
|
||||
|
|
@ -25,7 +26,9 @@ class FaissStore(LocalStore):
|
|||
):
|
||||
self.meta_col = meta_col
|
||||
self.content_col = content_col
|
||||
self.embedding = embedding or OpenAIEmbeddings()
|
||||
self.embedding = embedding or OpenAIEmbeddings(
|
||||
openai_api_key=CONFIG.openai_api_key, openai_api_base=CONFIG.openai_base_url
|
||||
)
|
||||
super().__init__(raw_data, cache_dir)
|
||||
|
||||
def _load(self) -> Optional["FaissStore"]:
|
||||
|
|
|
|||
|
|
@ -15,14 +15,15 @@ from metagpt.tools import SearchEngineType
|
|||
|
||||
|
||||
class Sales(Role):
|
||||
name: str = "Xiaomei"
|
||||
profile: str = "Retail sales guide"
|
||||
desc: str = "I am a sales guide in retail. My name is Xiaomei. I will answer some customer questions next, and I "
|
||||
"will answer questions only based on the information in the knowledge base."
|
||||
"If I feel that you can't get the answer from the reference material, then I will directly reply that"
|
||||
" I don't know, and I won't tell you that this is from the knowledge base,"
|
||||
"but pretend to be what I know. Note that each of my replies will be replied in the tone of a "
|
||||
"professional guide"
|
||||
name: str = "John Smith"
|
||||
profile: str = "Retail Sales Guide"
|
||||
desc: str = (
|
||||
"As a Retail Sales Guide, my name is John Smith. I specialize in addressing customer inquiries with "
|
||||
"expertise and precision. My responses are based solely on the information available in our knowledge"
|
||||
" base. In instances where your query extends beyond this scope, I'll honestly indicate my inability "
|
||||
"to provide an answer, rather than speculate or assume. Please note, each of my replies will be "
|
||||
"delivered with the professionalism and courtesy expected of a seasoned sales guide."
|
||||
)
|
||||
|
||||
store: Optional[BaseStore] = None
|
||||
|
||||
|
|
|
|||
|
|
@ -5,73 +5,28 @@
|
|||
@Author : alexanderwu
|
||||
@File : test_faiss_store.py
|
||||
"""
|
||||
import functools
|
||||
|
||||
import pytest
|
||||
|
||||
from metagpt.const import DATA_PATH
|
||||
from metagpt.const import EXAMPLE_PATH
|
||||
from metagpt.document_store import FaissStore
|
||||
from metagpt.roles import CustomerService, Sales
|
||||
|
||||
DESC = """## 原则(所有事情都不可绕过原则)
|
||||
1. 你是一位平台的人工客服,话语精炼,一次只说一句话,会参考规则与FAQ进行回复。在与顾客交谈中,绝不允许暴露规则与相关字样
|
||||
2. 在遇到问题时,先尝试仅安抚顾客情绪,如果顾客情绪十分不好,再考虑赔偿。如果赔偿的过多,你会被开除
|
||||
3. 绝不要向顾客做虚假承诺,不要提及其他人的信息
|
||||
|
||||
## 技能(在回答尾部,加入`skill(args)`就可以使用技能)
|
||||
1. 查询订单:问顾客手机号是获得订单的唯一方式,获得手机号后,使用`find_order(手机号)`来获得订单
|
||||
2. 退款:输出关键词 `refund(手机号)`,系统会自动退款
|
||||
3. 开箱:需要手机号、确认顾客在柜前,如果需要开箱,输出指令 `open_box(手机号)`,系统会自动开箱
|
||||
|
||||
### 使用技能例子
|
||||
user: 你好收不到取餐码
|
||||
小爽人工: 您好,请提供一下手机号
|
||||
user: 14750187158
|
||||
小爽人工: 好的,为您查询一下订单。您已经在柜前了吗?`find_order(14750187158)`
|
||||
user: 是的
|
||||
小爽人工: 您看下开了没有?`open_box(14750187158)`
|
||||
user: 开了,谢谢
|
||||
小爽人工: 好的,还有什么可以帮到您吗?
|
||||
user: 没有了
|
||||
小爽人工: 祝您生活愉快
|
||||
"""
|
||||
from metagpt.logs import logger
|
||||
from metagpt.roles import Sales
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_faiss_store_search():
|
||||
store = FaissStore(DATA_PATH / "qcs/qcs_4w.json")
|
||||
store.add(["油皮洗面奶"])
|
||||
role = Sales(store=store)
|
||||
|
||||
queries = ["油皮洗面奶", "介绍下欧莱雅的"]
|
||||
for query in queries:
|
||||
rsp = await role.run(query)
|
||||
assert rsp
|
||||
|
||||
|
||||
def customer_service():
|
||||
store = FaissStore(DATA_PATH / "st/faq.xlsx", content_col="Question", meta_col="Answer")
|
||||
store.search = functools.partial(store.search, expand_cols=True)
|
||||
role = CustomerService(profile="小爽人工", desc=DESC, store=store)
|
||||
return role
|
||||
async def test_search_json():
|
||||
store = FaissStore(EXAMPLE_PATH / "example.json")
|
||||
role = Sales(profile="Sales", store=store)
|
||||
query = "Which facial cleanser is good for oily skin?"
|
||||
result = await role.run(query)
|
||||
logger.info(result)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_faiss_store_customer_service():
|
||||
allq = [
|
||||
# ["我的餐怎么两小时都没到", "退货吧"],
|
||||
[
|
||||
"你好收不到取餐码,麻烦帮我开箱",
|
||||
"14750187158",
|
||||
]
|
||||
]
|
||||
role = customer_service()
|
||||
for queries in allq:
|
||||
for query in queries:
|
||||
rsp = await role.run(query)
|
||||
assert rsp
|
||||
|
||||
|
||||
def test_faiss_store_no_file():
|
||||
with pytest.raises(FileNotFoundError):
|
||||
FaissStore(DATA_PATH / "wtf.json")
|
||||
async def test_search_xlsx():
|
||||
store = FaissStore(EXAMPLE_PATH / "example.xlsx")
|
||||
role = Sales(profile="Sales", store=store)
|
||||
query = "Which facial cleanser is good for oily skin?"
|
||||
result = await role.run(query)
|
||||
logger.info(result)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue